406 Stimmen

Können Sie eine Höhenänderung auf eine UITableViewCell animieren, wenn ausgewählt?

Ich benutze eine UITableView in meiner iPhone-App, und ich habe eine Liste von Personen, die zu einer Gruppe gehören. Ich möchte es so, dass, wenn der Benutzer auf eine bestimmte Person klickt (also die Zelle auswählen), die Zelle in der Höhe wächst, um mehrere UI-Steuerelemente für die Bearbeitung der Eigenschaften dieser Person anzuzeigen.

Ist dies möglich?

11voto

axiixc Punkte 1963

Ich weiß nicht, was dieses ganze Zeug über das Aufrufen von beginUpdates/endUpdates in Folge ist, können Sie einfach verwenden -[UITableView reloadRowsAtIndexPaths:withAnimation:] . Hier ist ein Beispielprojekt .

10voto

fermin Punkte 596

Ich beschloss mit reloadRowsAtIndexPaths .

Ich speichere in didSelectRowAtIndexPath den indexPath der ausgewählten Zelle und rufen reloadRowsAtIndexPaths am Ende (Sie können NSMutableArray für die Liste der Elemente senden, die Sie neu laden möchten).

En heightForRowAtIndexPath können Sie prüfen, ob indexPath in der Liste der expandIndexPath-Zellen enthalten ist oder nicht, und die Höhe senden.

Sie können dieses einfache Beispiel überprüfen: https://github.com/ferminhg/iOS-Examples/tree/master/iOS-UITableView-Cell-Height-Change/celdascambiadetam Es ist eine einfache Lösung.

Ich füge eine Art Code hinzu, wenn es Ihnen hilft

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 20;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath*)indexPath
{
    if ([indexPath isEqual:_expandIndexPath])
        return 80;

    return 40;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Celda";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    [cell.textLabel setText:@"wopwop"];

    return cell;
}

#pragma mark -
#pragma mark Tableview Delegate Methods

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSMutableArray *modifiedRows = [NSMutableArray array];
    // Deselect cell
    [tableView deselectRowAtIndexPath:indexPath animated:TRUE];
    _expandIndexPath = indexPath;
    [modifiedRows addObject:indexPath];

    // This will animate updating the row sizes
    [tableView reloadRowsAtIndexPaths:modifiedRows withRowAnimation:UITableViewRowAnimationAutomatic];
}

5voto

midhun p Punkte 1541

Swift 4 und höher

Fügen Sie den folgenden Code in die Delegierungsmethode didselect row des Tableviews ein

tableView.beginUpdates()
tableView.setNeedsLayout()
tableView.endUpdates()

3voto

Nagarjun Punkte 6149

Versuchen Sie dies für das Erweitern von indexweisen Zeilen:

@property (nonatomic) NSIndexPath *expandIndexPath;
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
{
if ([indexPath isEqual:self.expandedIndexPath])
    return 100;

return 44;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSMutableArray *modifiedRows = [NSMutableArray array];
if ([indexPath isEqual:self.expandIndexPath]) {
    [modifiedRows addObject:self.expandIndexPath];
    self.expandIndexPath = nil;
} else {
    if (self.expandedIndexPath)
        [modifiedRows addObject:self.expandIndexPath];

    self.expandIndexPath = indexPath;
    [modifiedRows addObject:indexPath];
}

// This will animate updating the row sizes
[tableView reloadRowsAtIndexPaths:modifiedRows withRowAnimation:UITableViewRowAnimationAutomatic];

// Preserve the deselection animation (if desired)
[tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ViewControllerCellReuseIdentifier];
    cell.textLabel.text = [NSString stringWithFormat:@"I'm cell %ld:%ld", (long)indexPath.section, (long)indexPath.row];

return cell;
}

3voto

BOOL flag;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    flag = !flag;
    [tableView beginUpdates];
    [tableView reloadRowsAtIndexPaths:@[indexPath] 
                     withRowAnimation:UITableViewRowAnimationAutomatic];
    [tableView endUpdates];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES == flag ? 20 : 40;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X