2009-05-17 3 views
7

Ich habe eine benutzerdefinierte Benutzeroberfläche für meine Tabelle erstellt, die eine dunklere Benutzeroberfläche und eine benutzerdefinierte AccessoryView hat. Wenn ich den Tisch in den Bearbeitungsmodus bringe, gibt es eine weiße Linie links von der Reorder-Steuerung, die ich nicht loswerden kann.Entfernen Sie die weiße Linie neben Reorder-Steuerelement auf gruppierten UITableViewCell

Tableview: accessoryTypeForRowWithIndexPath: scheint nicht für das Loswerden es angemessen zu sein, da ich keinen Standard UITableViewCellAccessoryType verwenden, so dass ich bin mir nicht sicher, was ich tun kann, um es nicht aufstehen zeigen, auf meinen Zellen.

White Line Example http://secondgearsoftware.com/attachments/stackoverflow_reorder.png

Antwort

12

Wenn UITableViewCell das Reorder-Steuerelement zeigt, fügt es seinem leeren Array von Subviews außerdem eine leere, 1 Pixel breite weiße UIView hinzu.

Bluntly: das ist ein Fehler, den Apple beheben sollte.

Sie können jedoch umgehen, indem Sie diese nervende Ansicht jedes Mal finden, wenn sie erscheint, und ihre Hintergrundfarbe auf transparent einstellen. Quick tip: Die störende weiße Ansicht ist immer die letzte im Subview-Array der UITableViewCell und ist immer 1 Pixel breit. Wir werden dies benutzen, um es zu finden.

Wenn Sie die Bearbeitung für die Tabelle aktivieren, machen Sie alle sichtbaren, störenden 1-Pixel-Ansichten transparent. So ist die Aktion-Methode, die „Bearbeiten“ -Modus auf dem Tisch schaltet könnte wie folgt aussehen:

- (IBAction)edit:(id)sender 
{ 
    [tableView setEditing:!tableView.editing animated:YES]; 

    for (UITableViewCell *cell in [tableView visibleCells]) 
    { 
     if (((UIView *)[cell.subviews lastObject]).frame.size.width == 1.0) 
     { 
      ((UIView *)[cell.subviews lastObject]).backgroundColor = 
       [UIColor clearColor]; 
     } 
    } 
} 

und hält so für alle neue Ansichten zu tun, wie sie durch die Implementierung dieses in Ihrem UITableViewDelegate sichtbar werden:

- (void)tableView:(UITableView *)tableView 
    willDisplayCell:(UITableViewCell *)cell] 
    forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (((UIView *)[cell.subviews lastObject]).frame.size.width == 1.0) 
    { 
     ((UIView *)[cell.subviews lastObject]).backgroundColor = 
      [UIColor clearColor]; 
    } 
} 

Dieser Hack, um das Problem zu beheben, ist ziemlich harmlos und wenn Apple den Bug in Zukunft behebt (aufhören, die lästige 1-Pixel-Ansicht hinzuzufügen), sollte dieser Code ruhig aufhören, irgendetwas zu tun.

+0

Das funktioniert wie ein Charme. Danke, Matt. Ich stimme zu, dass dies kein wünschenswertes Verhalten ist, deshalb werde ich einen Fehler bei Apple einreichen. –

+0

Wenn Sie dies in Xcode 3.2.4 und iOS SDK 4.1 versuchen, ist das Objekt das zweitletzte, nicht das letzte Element. Das hat nicht funktioniert. – chrish

2

keine schnelle Antwort hier, aber können Sie bestimmen, welche spezifische View ist für diese weiße Linie verantwortlich?

Ein Trick, den ich manchmal verwende, um diese Art von Problemen zu "debuggen" ist, die Hintergrundfarben der Ansichten zu ändern, die die wahrscheinlichen Verdächtigen sind. Ich könnte die Hintergrundfarbe der TableViewCell sowie seine contentView auf rot oder blau einstellen und sehen, wenn Sie die Farbe der Linie ändern können. Das gibt dir zumindest einen Hinweis auf die Art des Problems und vielleicht einige Ideen, wie es gelöst werden kann.

1

Sie können die Ansicht tatsächlich abfangen und ändern, während eine Zelle in den Bearbeitungszustand übergeht. Fügen Sie diese Methodenüberschreibung zu Ihrer benutzerdefinierten UITableViewCell hinzu (und passen Sie sie an).

- (void)didTransitionToState:(UITableViewCellStateMask)state 
{ 
//modified from comments here: 
//http://www.erasetotheleft.com/post/overriding-the-drag-reorder-control-in-uitableviewcell/ 

if(state == UITableViewCellStateEditingMask) 
{ 
    for (UIControl *control in self.subviews) 
    { 
    // Find the Reorder Control 
    if ([control isMemberOfClass:NSClassFromString(@"UITableViewCellReorderControl")] && [control.subviews count] > 0) 
    { 
    // Do something with the control 
    } 
    } 
} 
} 
+0

Danke dafür. Ich habe nach dieser Neuordnungskontrolle gesucht. – Dimitris

+0

Wenn Sie dies in Xcode 3.2.4 und iOS SDK 4.1 versuchen, wird die Zeile immer noch das erste Mal angezeigt. Danach ist es versteckt. – chrish

2

Nachdem die Lösungen von @ matt-gallagher und @bryce versucht, kombiniert ich die beiden und eine Überschreibung von setEditing erstellt.

- (void)setEditing:(BOOL)editing animated:(BOOL)animated { 

    [super setEditing:editing animated:animated]; 

    for (UIControl *control in self.subviews) { 
     if (control.frame.size.width == 1.0f) { 
      control.backgroundColor = [UIColor clearColor]; 
     }     
    } 
} 
0

Ich hatte ein ähnliches Problem, aber in einem UITableViewStylePlain.

Meine Lösung dank @chrish und @ matt-gallagher:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    for (UIView *control in cell.subviews) 
    { 
     if (control.frame.size.width == 1.0f) 
     { 
      control.backgroundColor = [UIColor clearColor]; 
     }     
    } 
} 
Verwandte Themen