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?

2voto

Anthony Marchenko Punkte 339

Nur eine Anmerkung für jemanden wie mich, der nach "Mehr Details" für benutzerdefinierte Zellen sucht.

[tableView beginUpdates];
[tableView endUpdates];

Hat eine ausgezeichnete Arbeit, aber vergessen Sie nicht zu "beschneiden" Zellansicht. Wählen Sie im Interface Builder Ihre Zelle -> Inhaltsansicht -> wählen Sie im Eigenschafteninspektor " Clip-Unteransicht "

2voto

aBikis Punkte 323

Hier ist eine kürzere Version von Simons Antwort für Swift 3. Ermöglicht auch das Umschalten der Zellauswahl

var cellIsSelected: IndexPath?

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    cellIsSelected = cellIsSelected == indexPath ? nil : indexPath
    tableView.beginUpdates()
    tableView.endUpdates()
  }

  func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if cellIsSelected == indexPath {
      return 250
    }
    return 65
  }

1voto

ioopl Punkte 1685

Schnelle Version der Antwort von Simon Lee .

// MARK: - Variables 
  var isCcBccSelected = false // To toggle Bcc.

    // MARK: UITableViewDelegate
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

    // Hide the Bcc Text Field , until CC gets focused in didSelectRowAtIndexPath()
    if self.cellTypes[indexPath.row] == CellType.Bcc {
        if (isCcBccSelected) {
            return 44
        } else {
            return 0
        }
    }

    return 44.0
}

Dann in didSelectRowAtIndexPath()

  func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.tableView.deselectRowAtIndexPath(indexPath, animated: true)

    // To Get the Focus of CC, so that we can expand Bcc
    if self.cellTypes[indexPath.row] == CellType.Cc {

        if let cell = tableView.cellForRowAtIndexPath(indexPath) as? RecipientTableViewCell {

            if cell.tag == 1 {
                cell.recipientTypeLabel.text = "Cc:"
                cell.recipientTextField.userInteractionEnabled = true
                cell.recipientTextField.becomeFirstResponder()

                isCcBccSelected = true

                tableView.beginUpdates()
                tableView.endUpdates()
            }
        }
    }
}

1voto

Koushik Punkte 1150

Ja, es ist möglich.

UITableView hat eine delegierte Methode didSelectRowAtIndexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [UIView animateWithDuration:.6
                          delay:0
         usingSpringWithDamping:UIViewAnimationOptionBeginFromCurrentState
          initialSpringVelocity:0
                        options:UIViewAnimationOptionBeginFromCurrentState animations:^{

                            cellindex = [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section];
                            NSArray* indexArray = [NSArray arrayWithObjects:indexPath, nil];
                            [violatedTableView beginUpdates];
                            [violatedTableView reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationAutomatic];
                            [violatedTableView endUpdates];
                        }
                     completion:^(BOOL finished) {
    }];
}

Aber in Ihrem Fall, wenn der Benutzer scrollt und wählt eine andere Zelle dann u müssen die zuletzt ausgewählte Zelle zu schrumpfen und erweitern die aktuell ausgewählte Zelle haben reloadRowsAtIndexPaths: ruft auf. heightForRowAtIndexPath: also entsprechend behandeln.

0voto

Vitalii Gozhenko Punkte 8837

Hier ist mein Code der benutzerdefinierten UITableView Unterklasse, die die UITextView in der Tabellenzelle, ohne neu zu laden (und den Tastaturfokus zu verlieren):

- (void)textViewDidChange:(UITextView *)textView {
    CGFloat textHeight = [textView sizeThatFits:CGSizeMake(self.width, MAXFLOAT)].height;
    // Check, if text height changed
    if (self.previousTextHeight != textHeight && self.previousTextHeight > 0) {
        [self beginUpdates];

        // Calculate difference in height
        CGFloat difference = textHeight - self.previousTextHeight;

        // Update currently editing cell's height
        CGRect editingCellFrame = self.editingCell.frame;
        editingCellFrame.size.height += difference;
        self.editingCell.frame = editingCellFrame;

        // Update UITableView contentSize
        self.contentSize = CGSizeMake(self.contentSize.width, self.contentSize.height + difference);

        // Scroll to bottom if cell is at the end of the table
        if (self.editingNoteInEndOfTable) {
            self.contentOffset = CGPointMake(self.contentOffset.x, self.contentOffset.y + difference);
        } else {
            // Update all next to editing cells
            NSInteger editingCellIndex = [self.visibleCells indexOfObject:self.editingCell];
            for (NSInteger i = editingCellIndex; i < self.visibleCells.count; i++) {
                UITableViewCell *cell = self.visibleCells[i];
                CGRect cellFrame = cell.frame;
                cellFrame.origin.y += difference;
                cell.frame = cellFrame;
            }
        }
        [self endUpdates];
    }
    self.previousTextHeight = textHeight;
}

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