Μπορείτε να εμψυχώσει την αλλαγή του ύψους σε UITableViewCell όταν επιλεγεί;

ψήφοι
361

Είμαι χρησιμοποιώντας ένα UITableViewστο iPhone app μου, και έχω μια λίστα των ανθρώπων που ανήκουν σε μια ομάδα. Θα το ήθελα, έτσι ώστε όταν ο χρήστης κάνει κλικ σε ένα συγκεκριμένο πρόσωπο (επιλέγοντας έτσι το κύτταρο), το κύτταρο αναπτύσσεται σε ύψος για να εμφανίσετε διάφορα στοιχεία ελέγχου UI για την επεξεργασία των ιδιοτήτων του εν λόγω προσώπου.

Είναι δυνατόν;

Δημοσιεύθηκε 20/01/2009 στις 04:17
πηγή χρήστη
Σε άλλες γλώσσες...                            


21 απαντήσεις

ψήφοι
833

Βρήκα μια πραγματικά απλή λύση σε αυτό ως παρενέργεια σε ένα UITableViewδούλευα .....

Αποθηκεύστε το ύψος των κυττάρων σε μια μεταβλητή που αναφέρει το αρχικό ύψος κανονικά μέσω του tableView: heightForRowAtIndexPath:, στη συνέχεια, όταν θέλετε να εμψυχώσει μια αλλαγή ύψους, απλά αλλάξτε την τιμή της μεταβλητής και να καλέσει αυτό το ...

[tableView beginUpdates];
[tableView endUpdates];

Θα βρείτε ότι δεν κάνει μια πλήρη reload, αλλά είναι αρκετό για το UITableViewνα ξέρει ότι έχει να αναδιατυπώσει τα κύτταρα, αρπάζοντας τη νέα τιμή ύψους για το κελί .... και μάντεψε τι; Είναι ζωντανεύει την αλλαγή για εσάς. Γλυκός.

Έχω μια πιο λεπτομερή δείγματα εξηγήσεις και πλήρη κώδικα στο blog μου ... Κίνηση UITableView κυττάρων Ύψος Αλλαγή

Απαντήθηκε 14/01/2010 στις 12:42
πηγή χρήστη

ψήφοι
56

Μου αρέσει η απάντηση από τον Simon Lee. Δεν είχα πραγματικά να δοκιμάσετε αυτή τη μέθοδο, αλλά φαίνεται πως θα αλλάξετε το μέγεθος όλων των κυττάρων στη λίστα. Ήλπιζα για μια αλλαγή μόνο του κυττάρου που έχει αξιοποιηθεί. Εγώ κάπως το έκανε, όπως ο Simon αλλά με μόνο μια μικρή διαφορά. Αυτό θα αλλάξει την εμφάνιση ενός κυττάρου όταν έχει επιλεγεί. Και το κάνει κίνηση. Ακριβώς ένας άλλος τρόπος για να το κάνει.

Δημιουργήστε μια int για να κρατήσει μια τιμή για τον τρέχοντα δείκτη επιλεγμένο κελί:

int currentSelection;

Επειτα:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    int row = [indexPath row];
    selectedNumber = row;
    [tableView beginUpdates];
    [tableView endUpdates];
}

Επειτα:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    if ([indexPath row] == currentSelection) {
        return  80;
    }
    else return 40;


}

Είμαι βέβαιος ότι μπορείτε να κάνετε παρόμοιες αλλαγές στην TableView: cellForRowAtIndexPath: για να αλλάξετε τον τύπο του κυττάρου ή ακόμα και να φορτώσετε ένα αρχείο ΧΙβ για το κύτταρο.

Όπως αυτό, η currentSelection θα ξεκινήσει από το 0. Θα χρειαστεί να γίνουν προσαρμογές, αν δεν θέλετε το πρώτο κελί της λίστας (στο δείκτη 0) για να δούμε επιλεγμένο από προεπιλογή.

Απαντήθηκε 26/04/2011 στις 00:25
πηγή χρήστη

ψήφοι
19

Προσθέστε ένα ακίνητο για να παρακολουθείτε το επιλεγμένο κελί

@property (nonatomic) int currentSelection;

Ρυθμίστε σε μια τιμή δείκτες (για παράδειγμα) viewDidLoad, για να βεβαιωθείτε ότι οι UITableViewξεκινά στην «κανονική» θέση

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    //sentinel
    self.currentSelection = -1;
}

Σε heightForRowAtIndexPathμπορείτε να ρυθμίσετε το ύψος που θέλετε για το επιλεγμένο κελί

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    int rowHeight;
    if ([indexPath row] == self.currentSelection) {
        rowHeight = self.newCellHeight;
    } else rowHeight = 57.0f;
    return rowHeight;
}

Σε didSelectRowAtIndexPathμπορείτε να αποθηκεύσετε την τρέχουσα επιλογή και να αποθηκεύσετε μια δυναμική ύψος, εάν απαιτείται

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        // do things with your cell here

        // set selection
        self.currentSelection = indexPath.row;
        // save height for full text label
        self.newCellHeight = cell.titleLbl.frame.size.height + cell.descriptionLbl.frame.size.height + 10;

        // animate
        [tableView beginUpdates];
        [tableView endUpdates];
    }
}

Σε didDeselectRowAtIndexPathρυθμίσετε το δείκτη επιλογής πίσω στην τιμή-δείκτες και την κίνηση του κυττάρου πίσω στην κανονική μορφή

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {       
        // do things with your cell here

        // sentinel
        self.currentSelection = -1;

        // animate
        [tableView beginUpdates];
        [tableView endUpdates];
    }
}
Απαντήθηκε 05/08/2013 στις 17:02
πηγή χρήστη

ψήφοι
12

reloadData δεν είναι καλό γιατί δεν υπάρχει κινούμενα σχέδια ...

Αυτό είναι ό, τι είμαι σήμερα προσπαθούν:

NSArray* paths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]];
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationFade];
[self.tableView deleteRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];

Είναι σχεδόν λειτουργεί σωστά. Σχεδόν. Είμαι αυξάνοντας το ύψος του κυττάρου, και μερικές φορές υπάρχει μια μικρή «λόξιγκα» στην προβολή πίνακα, όπως το κύτταρο αντικαθίσταται, ως εάν κάποια θέση κύλιση στην προβολή πίνακα είναι να διατηρηθεί, το νέο κύτταρο (το οποίο είναι το πρώτο κύτταρο στον πίνακα) καταλήγει με offset πολύ υψηλή της, και η scrollview αναπηδά για να το μετακινήσετε.

Απαντήθηκε 07/05/2009 στις 00:24
πηγή χρήστη

ψήφοι
10

Θα επιλυθεί με reloadRowsAtIndexPaths.

Που εκτός από didSelectRowAtIndexPathτην indexPath των κυττάρων που επιλέγονται και να καλέσει reloadRowsAtIndexPathsστο τέλος (μπορείτε να στείλετε NSMutableArray για τη λίστα των στοιχείων που θέλετε reload).

Σε heightForRowAtIndexPathμπορείτε να ελέγξετε αν indexPath είναι στη λίστα ή όχι των expandIndexPath κυττάρου και στείλτε το ύψος.

Μπορείτε να ελέγξετε αυτό το βασικό παράδειγμα: https://github.com/ferminhg/iOS-Examples/tree/master/iOS-UITableView-Cell-Height-Change/celdascambiadetam Είναι μια απλή λύση.

μπορώ να προσθέσω ένα είδος κώδικα, αν σας βοηθήσει

- (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];
}
Απαντήθηκε 14/11/2014 στις 13:20
πηγή χρήστη

ψήφοι
10

Δεν ξέρω τι όλα αυτά τα πράγματα σχετικά με την κλήση beginUpdates / endUpdates διαδοχικά, μπορείτε να χρησιμοποιήσετε μόνο -[UITableView reloadRowsAtIndexPaths:withAnimation:]. Εδώ είναι ένα παράδειγμα του έργου .

Απαντήθηκε 02/08/2014 στις 23:52
πηγή χρήστη

ψήφοι
2
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;
}
Απαντήθηκε 15/08/2016 στις 16:32
πηγή χρήστη

ψήφοι
2

μόνο μια σημείωση για κάποιον σαν εμένα που ψάχνουν για να προσθέσετε «Περισσότερα» για έθιμο κυττάρων.

[tableView beginUpdates];
[tableView endUpdates];

Μήπως μια εξαιρετική δουλειά, αλλά μην ξεχάσετε να «καλλιέργεια» προβολή των κυττάρων. Από Interface Builder, επιλέξτε το κινητό σας -> Περιεχομένου -> από Επιθεωρητής Ακίνητα επιλέξτε « δευτερεύουσας προβολής Clip »

Απαντήθηκε 25/03/2015 στις 20:08
πηγή χρήστη

ψήφοι
2

Δοκιμάστε αυτό είναι για την επέκταση indexwise σειρά:

@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;
}
Απαντήθηκε 24/09/2014 στις 06:41
πηγή χρήστη

ψήφοι
1

Αντί beginUpdates()/ endUpdates(), η συνιστώμενη κλήση είναι τώρα:

tableView.performBatchUpdates(nil, completion: nil)

Η Apple λέει, όσον αφορά beginUpdates / endUpdates: «Χρησιμοποιήστε τα performBatchUpdates (_. Την ολοκλήρωση μέθοδο αντί για αυτό, όποτε είναι δυνατόν :)»

Δείτε: https://developer.apple.com/documentation/uikit/uitableview/1614908-beginupdates

Απαντήθηκε 19/11/2018 στις 16:47
πηγή χρήστη

ψήφοι
1

Εδώ είναι μια μικρότερη έκδοση του Simons απάντηση για Swift 3. επιτρέπει επίσης για την εναλλαγή της επιλογής του κυττάρου

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
  }
Απαντήθηκε 30/05/2017 στις 23:36
πηγή χρήστη

ψήφοι
1

Swift έκδοση της απάντησης 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
}

Στη συνέχεια, το 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()
            }
        }
    }
}
Απαντήθηκε 07/06/2016 στις 15:30
πηγή χρήστη

ψήφοι
0

Swift 4 και Πάνω

προσθέστε παρακάτω κώδικα σε εσάς μέθοδο didselect σειρά εκπρόσωπος TableView του

tableView.beginUpdates()
tableView.setNeedsLayout()
tableView.endUpdates()
Απαντήθηκε 23/11/2018 στις 11:53
πηγή χρήστη

ψήφοι
0

Είσοδοι -

tableView.beginUpdates () tableView.endUpdates () αυτές οι λειτουργίες δεν θα καλέσει

func TableView (_ TableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {}

Αλλά, αν το κάνετε, tableView.reloadRows (στη διεύθυνση: [selectedIndexPath ως IndexPath!], Με: .none)

Θα καλέσει την TableView func (_ TableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {} αυτή τη λειτουργία.

Απαντήθηκε 28/03/2018 στις 11:08
πηγή χρήστη

ψήφοι
0

Swift έκδοση του απάντηση Simon Λι :

tableView.beginUpdates()
tableView.endUpdates()

Λάβετε υπόψη ότι θα πρέπει να τροποποιήσετε τις ιδιότητες του ύψους ΠΡΙΝ endUpdates() .

Απαντήθηκε 08/02/2018 στις 14:11
πηγή χρήστη

ψήφοι
0

Ναι είναι δυνατό.

UITableView έχει μια μέθοδο πληρεξούσιο 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) {
    }];
}

Αλλά στην περίπτωσή σας, εάν ο χρήστης κάνει κύλιση και επιλέγει ένα διαφορετικό κελί τότε u πρέπει να έχει τον τελευταίο επιλεγμένο κελί για να συρρικνωθεί και να επεκτείνει το τρέχον επιλεγμένο κελί reloadRowsAtIndexPaths:κλήσεις heightForRowAtIndexPath:, ώστε να χειριστεί αναλόγως.

Απαντήθηκε 01/08/2016 στις 11:29
πηγή χρήστη

ψήφοι
0

Ελέγξτε τη μέθοδο αυτή μετά iOS 7 και αργότερα.

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return UITableViewAutomaticDimension;
}

Βελτιώσεις έχουν γίνει σε αυτό το iOS 8. Μπορούμε να το ορίσετε ως ιδιοκτησία της ίδιας της προβολής πίνακα.

Απαντήθηκε 04/03/2016 στις 12:10
πηγή χρήστη

ψήφοι
0

Θα χρησιμοποιηθεί @ τρομερή απάντηση χαρά του, και δούλεψε τέλεια με ios 8.4 και το Xcode 7.1.1.

Σε περίπτωση που ψάχνετε για να κάνετε το κινητό σας εναλλαγής-θέση, άλλαξα το -tableViewDidSelect με το ακόλουθο:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
//This is the bit I changed, so that if tapped once on the cell, 
//cell is expanded. If tapped again on the same cell, 
//cell is collapsed. 
    if (self.currentSelection==indexPath.row) {
        self.currentSelection = -1;
    }else{
        self.currentSelection = indexPath.row;
    }
        // animate
        [tableView beginUpdates];
        [tableView endUpdates];

}

Ελπίζω ότι κάποια από αυτό σας βοήθησε.

Απαντήθηκε 19/11/2015 στις 21:00
πηγή χρήστη

ψήφοι
0

Εδώ είναι ο κωδικός μου έθιμο UITableViewυποκατηγορίας, η οποία επεκτείνει UITextViewστο κελί του πίνακα, χωρίς επαναφόρτωση (και να χάσει την εστίαση του πληκτρολογίου):

- (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;
}
Απαντήθηκε 10/11/2015 στις 02:14
πηγή χρήστη

ψήφοι
-1

Απλά επιλυθεί αυτό το πρόβλημα με μια μικρή αμυχή:

static int s_CellHeight = 30;
static int s_CellHeightEditing = 60;

- (void)onTimer {
    cellHeight++;
    [tableView reloadData];
    if (cellHeight < s_CellHeightEditing)
        heightAnimationTimer = [[NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(onTimer) userInfo:nil repeats:NO] retain];
}

- (CGFloat)tableView:(UITableView *)_tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
        if (isInEdit) {
            return cellHeight;
        }
        cellHeight = s_CellHeight;
        return s_CellHeight;
}

Όταν πρέπει να επεκτείνει το ύψος των κυττάρων μπορώ να ορίσω isInEdit = YESκαι να καλέσει τη μέθοδο [self onTimer]και ζωντανεύει την ανάπτυξη των κυττάρων, μέχρι να φτάσει την τιμή s_CellHeightEditing :-)

Απαντήθηκε 20/08/2009 στις 21:18
πηγή χρήστη

ψήφοι
-1

Αποκτήστε το indexpath της σειράς επιλεγμένων. Ανανέωση του πίνακα. Στη μέθοδο heightForRowAtIndexPath της UITableViewDelegate, ρυθμίστε το ύψος της γραμμής που επιλέγεται σε ένα διαφορετικό ύψος και για τους άλλους επιστρέψει το κανονικό ύψος της γραμμής

Απαντήθηκε 21/01/2009 στις 16:13
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more