Tud animálni magassága változás a UITableViewCell amikor a kiválasztott?

szavazat
361

Én használ egy UITableViewaz én iPhone app, és van egy lista az emberek, hogy egy csoportba tartozónak kell. Szeretném, hogy amikor a felhasználó rákattint egy adott személy (tehát adja meg a cella), a sejt növekszik magassága megjelenítéséhez több UI vezérlők tulajdonságainak szerkesztéséhez az adott személy.

Van erre lehetőség?

A kérdést 20/01/2009 04:17
a forrás felhasználó
Más nyelveken...                            


21 válasz

szavazat
833

Találtam egy nagyon egyszerű megoldás, hogy ez a mellékhatása, hogy egy UITableViewdolgoztam .....

Tárolja a cella magassága változó, hogy a jelentések az eredeti magassága általában keresztül tableView: heightForRowAtIndexPath:, majd amikor az animálni kívánt magasságig változás, egyszerűen változtatni a változó értékét, és hívja ezt ...

[tableView beginUpdates];
[tableView endUpdates];

Meg fogja találni nem csinál egy teljes újratöltés, de elég a UITableViewhogy tudja azt, hogy dolgozza át a sejteket, és megragadta az új magasság értéket a cella .... és tudod mit? Ez élteti a változás az Ön számára. Édes.

Van egy részletesebb magyarázatot és teljes kódmintákat blogomban ... Animate UITableView cella magassága Change

Válaszolt 14/01/2010 12:42
a forrás felhasználó

szavazat
56

Szeretem a válasz Simon Lee. Én valójában nem próbálja meg ezt a módszert, de úgy néz ki, mintha lenne változtatni a méretét az összes sejt a listán. Reméltem, hogy a változás csak a cellára, hogy lehallgatják. Én kicsit tettem, mint Simon, de csak egy kis különbség. Ez meg fogja változtatni a kinézetét egy sejt, ha be van jelölve. És ez nem animálni. Csak egy módja annak, hogy csináld.

Hozzon létre egy int, hogy tartsa egy értéket az aktuális kijelölt cella index:

int currentSelection;

Azután:

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

Azután:

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

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


}

Biztos vagyok benne, akkor is hasonló változtatásokat Tableview: cellForRowAtIndexPath: megváltoztatni a sejttípus vagy akár betöltéséhez XIb fájlt a cellában.

Mint ez a currentSelection indul 0. Azt kell, hogy a kiigazításokat, ha nem akarja az első cella a lista (0 indexű), és vizsgáljuk az alapértelmezett beállítás.

Válaszolt 26/04/2011 00:25
a forrás felhasználó

szavazat
19

Add a tulajdonság, hogy nyomon követhesse a kijelölt cella

@property (nonatomic) int currentSelection;

Állítsa a sentinel értéket (például) viewDidLoad, hogy megbizonyosodjon arról, hogy az UITableViewelindul a „normális” helyzetben

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

    //sentinel
    self.currentSelection = -1;
}

A heightForRowAtIndexPathbeállíthatja a kívánt magasságot a kijelölt cella

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

A didSelectRowAtIndexPathelmentheti az aktuális kiválasztási és mentse a dinamikus magasság, ha szükséges

- (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];
    }
}

A didDeselectRowAtIndexPathkijelölés beállításához index vissza a sentinel érték és animálni a cella visszatér a normál forma

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

        // sentinel
        self.currentSelection = -1;

        // animate
        [tableView beginUpdates];
        [tableView endUpdates];
    }
}
Válaszolt 05/08/2013 17:02
a forrás felhasználó

szavazat
12

reloadData nem jó, mert nincs animáció ...

Ez az, amit én jelenleg próbálják:

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];

Szinte azonnal üzembe. Majdnem. Én magasságának növelése a sejt, és néha van egy kis „csuklás” a táblázat nézet, mint a sejt helyébe, mintha valami görgetés pozícióját a táblázat nézet megőriznek, az új cella (ami az első cella a táblázatban) végződik, annak eltolás túl magas, és a scrollview pattog helyezni.

Válaszolt 07/05/2009 00:24
a forrás felhasználó

szavazat
10

Azt megoldani reloadRowsAtIndexPaths.

Azt kivéve didSelectRowAtIndexPatha indexPath sejt kiválasztott, és hívja reloadRowsAtIndexPathsa végén (küldhetünk NSMutableArray a listát elem kívánt reload).

Az heightForRowAtIndexPathellenőrizheti, hogy indexPath van a listán vagy sem expandIndexPath sejt és küldje magasságát.

Akkor ezt nézd egyszerű példa: https://github.com/ferminhg/iOS-Examples/tree/master/iOS-UITableView-Cell-Height-Change/celdascambiadetam Ez egy egyszerű megoldás.

hozzáteszem egyfajta kódot, ha segít

- (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];
}
Válaszolt 14/11/2014 13:20
a forrás felhasználó

szavazat
10

Nem tudom, hogy mi ez az egész, hogy felhívom beginUpdates / endUpdates keresztül folyamatosan, akkor csak használ -[UITableView reloadRowsAtIndexPaths:withAnimation:]. Itt egy példa a projekt .

Válaszolt 02/08/2014 23:52
a forrás felhasználó

szavazat
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;
}
Válaszolt 15/08/2016 16:32
a forrás felhasználó

szavazat
2

Csak egy megjegyzés, hogy valaki, mint én, keres hozzá „Részletek” egyéni cellába.

[tableView beginUpdates];
[tableView endUpdates];

Volt egy kiváló munkát, de ne felejtsük el, hogy „termés” sejt kilátás. A Interface Builder válassza ki a Cell -> Tartalom -> honnan Property Inspector válassza ki a " Clip subview "

Válaszolt 25/03/2015 20:08
a forrás felhasználó

szavazat
2

Próbáld ki ezt a bővülő indexwise sor:

@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;
}
Válaszolt 24/09/2014 06:41
a forrás felhasználó

szavazat
1

Ahelyett beginUpdates()/ endUpdates()ajánlott hívás most:

tableView.performBatchUpdates(nil, completion: nil)

Az Apple azt mondja, tekintettel beginUpdates / endUpdates: „A performBatchUpdates (_: befejezés :) módszer helyett ezt, amikor csak lehetséges.”

Lásd: https://developer.apple.com/documentation/uikit/uitableview/1614908-beginupdates

Válaszolt 19/11/2018 16:47
a forrás felhasználó

szavazat
1

Itt egy rövidebb változata Simons válasz Swift 3 is lehetővé teszi, változni fog a sejt kiválasztási

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
  }
Válaszolt 30/05/2017 23:36
a forrás felhasználó

szavazat
1

Swift verziószáma Simon Lee válasza.

// 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
}

Aztán 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()
            }
        }
    }
}
Válaszolt 07/06/2016 15:30
a forrás felhasználó

szavazat
0

Swift 4 és újabb

add alább kódot akkor Tableview a didselect sor küldötte módszer

tableView.beginUpdates()
tableView.setNeedsLayout()
tableView.endUpdates()
Válaszolt 23/11/2018 11:53
a forrás felhasználó

szavazat
0

bemenet -

tableView.beginUpdates () tableView.endUpdates () akkor ezek a funkciók nem hívja

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

De ha mégis, tableView.reloadRows (itt: [selectedIndexPath! Mint IndexPath], ahol: .none)

Ez hívja a FUNC Tableview (_ Tableview: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {} ezt a funkciót.

Válaszolt 28/03/2018 11:08
a forrás felhasználó

szavazat
0

Swift változata Simon Lee válasza :

tableView.beginUpdates()
tableView.endUpdates()

Tartsuk szem előtt, hogy módosítsa a magasságot tulajdonságok ELŐTT endUpdates() .

Válaszolt 08/02/2018 14:11
a forrás felhasználó

szavazat
0

Igen, ez lehetséges.

UITableView egy delegáltja eljárás 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) {
    }];
}

De az Ön esetében, ha a felhasználó görgeti, és kiválaszt egy másik cellában, majd u kell az utolsó kijelölt cella zsugorodik és bővíteni a jelenleg kiválasztott cella reloadRowsAtIndexPaths:hívások heightForRowAtIndexPath:így kezelni kell.

Válaszolt 01/08/2016 11:29
a forrás felhasználó

szavazat
0

Jelölje be ezt az eljárást követően iOS 7 és újabb.

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

Fejlesztések történtek ezen az iOS 8. Mi lehet állítani, mint tulajdonát a táblázat nézet is.

Válaszolt 04/03/2016 12:10
a forrás felhasználó

szavazat
0

Régebben @ Joy félelmetes választ, és tökéletesen működött az iOS 8.4 és 7.1.1 XCode.

Ha keres, hogy a sejt billenôkaros képes, én változott a -tableViewDidSelect a következő:

-(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];

}

Remélem valamelyik, ez segített.

Válaszolt 19/11/2015 21:00
a forrás felhasználó

szavazat
0

Itt van a kód egyedi UITableViewalosztály, amely bővíteni UITextViewaz asztalnál sejt, újratöltés nélkül (és elvesznek a fókuszt):

- (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;
}
Válaszolt 10/11/2015 02:14
a forrás felhasználó

szavazat
-1

Csak megoldani ezt a problémát egy kis hack:

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;
}

Mikor kell bővíteni a cella magasságát beállítani isInEdit = YES, és hívja a módszer [self onTimer], és ez éltet a sejtnövekedést, amíg eléri a s_CellHeightEditing érték :-)

Válaszolt 20/08/2009 21:18
a forrás felhasználó

szavazat
-1

Szerezd meg a indexpath a sor kiválasztva. Reload az asztalra. A heightForRowAtIndexPath módszer UITableViewDelegate, állítsa a magassága a sorban kiválasztott egy különböző magasságú és a többiek vissza a normális sormagasság

Válaszolt 21/01/2009 16:13
a forrás felhasználó

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