2016-07-06 8 views
0

Ich versuche, eine dynamische UITableView zu erstellen, wo eine cell erweitern/reduzieren kann, wie der Benutzer die cell auswählt.Das Ausblenden eines UILabel von einer UITableViewCell ändert nicht die Größe der contentView

- (void)setUpCell:(DynamicTableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath { 
    cell.label.text = [self.dataSource objectAtIndex:indexPath.row]; 
    cell.secondLabel.text = [self.dataSource objectAtIndex:self.dataSource.count - indexPath.row - 1]; 
    if ([self.isVisible[indexPath.row] isEqual:@NO]) { 
     cell.secondLabel.hidden = YES; 
    } else { 
     cell.secondLabel.hidden = NO; 
    } 
} 


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return self.dataSource.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    DynamicTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
    [self setUpCell:cell atIndexPath:indexPath]; 

    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    DynamicTableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    if ([self.isVisible[indexPath.row] isEqual: @YES]) { 
     self.isVisible[indexPath.row] = @NO; 
     cell.secondLabel.hidden = YES; 
    } else { 
     self.isVisible[indexPath.row] = @YES; 
     cell.secondLabel.hidden = NO; 
    } 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static DynamicTableViewCell *cell = nil; 
    static dispatch_once_t onceToken; 

    dispatch_once(&onceToken, ^{ 
     cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    }); 

    [self setUpCell:cell atIndexPath:indexPath]; 

    return [self calculateHeightForConfiguredSizingCell:cell]; 
} 

- (CGFloat)calculateHeightForConfiguredSizingCell:(DynamicTableViewCell *)sizingCell { 
    [sizingCell layoutIfNeeded]; 

    CGSize size = [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 
    return size.height; 
} 

gegabelt ich this Projekt und haben den Testcode here.

Sobald die Größe der Zelle geändert wurde, ändert sie sich nicht, wenn die Zelle ausgewählt wird, nur der Inhalt der Zelle wird ausgeblendet. Ich habe versucht, die explizite Größenberechnung durch UITableViewAutomaticDimension zu ersetzen. Habe auch versucht, die Zelle neu zu laden. Scheint, sobald die Zellengröße berechnet wurde, ändert es sich nicht.

Alle Vorschläge, was zu versuchen wäre sehr dankbar!

Antwort

1

In iOS Entwicklung eine Ansicht nie kollabiert, wenn Sie setzen die hidden Eigenschaft auf true.

Stattdessen sollten Sie das automatische Layout verwenden. Angenommen, Ihre Ansicht enthält zwei vertikal übereinander gestapelte Beschriftungen, stecken Sie die erste Beschriftung in den oberen Bereich der Zellen contentView, geben Sie eine Höhenkondensität, die zweite Beschriftung oben an die erste Beschriftung unten und die zweite Beschriftung unten an die contentView der Zelle an Unterseite. Legen Sie die Höhe des zweiten Labels fest und speichern Sie dieses Constraint in einer Variablen. Lassen Sie es secondLabelHeightConstraint heißen. Jetzt können Sie die Zelle reduzieren und erweitern, indem Sie den Wert secondLabelHeightConstraint auf 0 oder den Wert setzen, den Sie möchten.

+0

Danke! Dies endete mit ein paar zusätzlichen Änderungen, um die variable Höhe des UILabel zu gewährleisten. –

+0

Nice Philip, froh zu helfen! Ich nehme an, Sie haben etwas Erfahrung mit Android? Denn in Android können Sie view.setVisibility (View.GONE); und dann wird diese Ansicht "zusammenbrechen". In iOS ist es etwas kniffliger. Autolayout ist der Weg zu gehen :) – Sajjon

Verwandte Themen