2015-07-01 13 views
20

Próbuję usunąć separator dla jednego UITableViewCell. Zrobiłem, co następuje:Usuń linię separatora tylko dla jednej komórki

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell; 
    cell = [super tableView:tableView cellForRowAtIndexPath:indexPath]; 

    if (indexPath.row == 1) 
     cell.separatorInset = UIEdgeInsetsZero; 

    return cell; 
} 

(to static cells). Kiedy uruchomić aplikację. Linia separatora nadal tam jest. Jak mogę usunąć linię separatora dla jednego cell?

+0

Ustawianie separatorInset do UIEdgeInsetsZero ma pokaż separator the z od lewej do prawej. Czy chcesz ukryć separatorInset tylko przy indeksie rzędu 1? – thanyaj

+0

Tak. Próbuję ukryć separator w wierszu indeksu 1 – Jessica

+0

usunięcie tylko 1 separatora na komórce jest trudne, ponieważ albo masz wszystkie seperator wstawki lub nie. Zwykle zakończyłem implementację mojego własnego widoku separatora, który jest tylko uiview o wysokości 1 piksela. Następnie zaprojektuj, aby pokazać i ukryć widok separatora. Mogą być lepsze pomysły. które chciałbym się dobrze uczyć. – thanyaj

Odpowiedz

18

iOS 8 trzeba użyć:

cell.layoutMargins = UIEdgeInsetsZero 

Jeśli chcesz być kompatybilne z iOS 7, jak również należy zrobić co następuje:

if ([cell respondsToSelector:@selector(setSeparatorInset:)]) { 
    [cell setSeparatorInset:UIEdgeInsetsZero]; 
} 

if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { 
    [cell setLayoutMargins:UIEdgeInsetsZero]; 
} 

ADD: jeśli poprzedni wstałem t pracy - użyj tego. (Z odpowiedzią poniżej)

cell.separatorInset = UIEdgeInsetsMake(0, 1000, 0, 0); 
+0

Czy druga metoda obsługuje również ios 8? – Jessica

+0

pierwsza dotyczy systemu iOS 7 i niżej, druga jest dla systemu iOS 8. Musisz umieścić obie w swojej aplikacji, aby działał poprawnie dla danej wersji iOS –

+0

(W odpowiedzi, którą napisałeś, pierwsza dotyczy wersji io8. Czy muszę mieć instrukcję if obsługującą obie wersje? – Jessica

0

Inny sposób, że jest nieco hacky jest tworzenie niestandardowych Table View komórki z UIView, który działa jak separator wstawka. Następnie ukryj i pokaż, kiedy chcesz.

stworzyłem SampleTableViewCell i plik nib z etykietą i separatorLineView

@interface SampleTableViewCell : UITableViewCell 
@property (weak, nonatomic) IBOutlet UILabel *titleLabel; 
@property (weak, nonatomic) IBOutlet UIView *separatorLineView; 
@end 

Następnie w ViewController klasy

@interface ViewController() 
@property (nonatomic) NSArray *items; 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.items = @[@"A", @"B", @"C"]; 
    [self.tableView registerNib:[UINib nibWithNibName:@"SampleTableViewCell" bundle:nil] forCellReuseIdentifier:@"SampleCell"]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    SampleTableViewCell *cell = (SampleTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"SampleCell" forIndexPath:indexPath]; 
    cell.titleLabel.text = self.items[indexPath.row]; 
    if (indexPath.row == 1) { 
     cell.separatorLineView.hidden = YES; 
    } else { 
     cell.separatorLineView.hidden = NO; 
    } 
    return cell; 
} 

@end 
13

Można tylko wizualnie ukryć separator poprzez separatorInset nieruchomości:

tableViewCell.separatorInset = UIEdgeInsets(top: 0, left: 10000, bottom: 0, right: 0) 
+0

Ładne obejście! –

+0

Hacky obejść. –

1

Dla tych, którzy walczą z tym iOS 9 rozwiązanie jest trochę inne niż odpowiedzi już udzielone. Oto jak rozwiązać go w Swift:

override func viewWillAppear(animated: Bool) { 
    table.cellLayoutMarginsFollowReadableWidth = false 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    if IS_THE_CELL_WITH_NO_SEPARATOR{ 
     cell.separatorInset = UIEdgeInsetsZero 
     cell.preservesSuperviewLayoutMargins = false 
     cell.layoutMargins = UIEdgeInsetsZero 
    } 
} 

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    if IS_THE_CELL_WITH_NO_SEPARATOR{ 
     let size = self.view.bounds.size 
     let rightInset = size.width > size.height ? size.width : size.height 
     cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, rightInset) 
    } 
} 
5

Jeśli chcesz ukryć linię rozdzielającą wyłącznie dla określonego typu komórki, można użyć następującego kodu:

override func layoutSubviews() { 
    super.layoutSubviews() 
    subviews.forEach { (view) in 
     if view.dynamicType.description() == "_UITableViewCellSeparatorView" { 
      view.hidden = true 
     } 
    } 
} 

napisać ten kod w komórka (musi to być podklasa UITableViewCell), dla której nie chcesz, aby pojawiała się linia podziału.

+2

Wypróbowałem kilka innych rozwiązań, które okazały się najmniej hackowskie. Swift 3.0, jest to właściwy Składnia 'subviews.forEach {widok w gdy typ (z: widzenia) .description() == "_UITableViewCellSeparatorView"{ view.isHidden = prawda } }' – gokeji

+2

Hackiest z rozwiązania. –

+0

Ostrzeżenie - powoduje to problemy w systemie iOS 10. Wydaje się, że iOS klonuje właściwości separatora między instancjami komórki, a zupełnie różne klasy komórek na różnych widokach tabeli zaczynają się pojawiać bez separatora. –

1
cell.separatorInset = UIEdgeInsetsMake(0.0 , cell.bounds.size.width , 0.0, -cell.bounds.size.width) 
+1

Chociaż może to odpowiedzieć na pytanie, jakiś kontekst i/lub wyjaśnienie byłoby miłe. Dla przyszłych czytelników również. – VDWWD

-5

Swift 3 usuń separator wszystkich komórek:

override func viewDidLoad() { 
     self.yourTableView.separatorStyle = UITableViewCellSeparatorStyle.none 
    } 
+0

Użyj linku [edit], aby wyjaśnić działanie tego kodu, a nie tylko podać kod, ponieważ wyjaśnienie może pomóc przyszłym czytelnikom. Zobacz także [odpowiedź]. [źródło] (http://stackoverflow.com/users/5244995) –

+0

Co ważniejsze, ta odpowiedź nie odpowiada na zadane pytanie. Ten kod po prostu wyłącza separatory w całej tabeli; nie selektywnie na pojedynczej komórce na raz. – SimplePanda

2

Wystarczy dodać następujące do celi nie ma separator (SWIFT 3):

override func awakeFromNib() { 
    super.awakeFromNib() 

    // remove separator 
    self.separatorInset = UIEdgeInsetsMake(0, 1000, 0, 0) 
} 
Powiązane problemy