seçildiğinde bir UITableViewCell bir yükseklik değişikliği animasyon miyim?

oy
361

Ben kullanıyorum UITableViewbenim iPhone app ve bir gruba ait kişilerin listesi var. Kullanıcı (böylece hücreyi seçerek) belirli bir kişiye tıkladığında, hücre o kişinin özelliklerini düzenlemek için çeşitli UI kontrolleri görüntülemek için yüksekliğinde büyür, böylece bunu istiyoruz.

Mümkün mü?

Oluştur 20/01/2009 saat 04:17
kaynak kullanıcı
Diğer dillerde...                            


21 cevaplar

oy
833

Ben bir yan etkisi olarak buna bir GERÇEKTEN BASİT çözüm buldu UITableViewüzerinde çalıştığım .....

Üzerinde normal orijinal yüksekliğini bildiriyor bir değişken hücre yüksekliğini Mağaza tableView: heightForRowAtIndexPath:Eğer bir yükseklik değişikliği animasyon uygulamak istediğinizde, o zaman, sadece değişkenin değerini değiştirmek ve bu ara ...

[tableView beginUpdates];
[tableView endUpdates];

Sen tam yeniden yapmaz bulmak ama yeter olacak UITableViewo hücre için yeni yükseklik değeri kapma, hücreleri yeniden çizmek zorunda biliyorum .... ve ne tahmin etmek? Bu sizin için değişim ANIMATES. Tatlı.

Blogumda ... konusunda daha ayrıntılı bir açıklama ve tam kod örnekleri var Animate UITableView Hücre Yüksekliği Değişikliği

Cevap 14/01/2010 saat 12:42
kaynak kullanıcı

oy
56

Simon Lee tarafından cevap gibi. Aslında bu yöntemi deneyin vermedi ama listedeki tüm hücrelerin boyutunu değiştirecek gibi görünüyor. Ben dokunulduğunda sadece hücrenin değişikliği için umuyordum. Ben biraz Simon gibi ama sadece biraz fark ile yaptı. seçildiğinde bu hücrenin göz değişecektir. Ve bu animasyon yok. bunu yapmak için başka bir yolu.

Geçerli seçili hücre dizini için bir değer taşıması için bir int oluşturun:

int currentSelection;

Sonra:

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

Sonra:

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

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


}

cellForRowAtIndexPath: hücre için bir xib dosyası hücresinin tipini değiştirebilir, hatta yüklemek için seni tableView benzer değişiklikler yapabilirsiniz eminim.

Bunun gibi, currentSelection varsayılan olarak seçilmiş bakmaya (0 dizininde) listesinin ilk hücresini istemiyorsa 0'dan Sen ayarlamalar yapmak gerekir başlayacaktır.

Cevap 26/04/2011 saat 00:25
kaynak kullanıcı

oy
19

Seçili hücrenin takip etmek için bir özellik ekleyin

@property (nonatomic) int currentSelection;

(Örneğin) bir sentinel değere ayarlayın viewDidLoad, emin olmak için UITableView'normal' pozisyonunda başlar

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

    //sentinel
    self.currentSelection = -1;
}

Gelen heightForRowAtIndexPathsen yüksekliğini ayarlayabilirsiniz seçilen hücre için istediğiniz

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

In didSelectRowAtIndexPathgerekirse size, geçerli seçimi kaydetmek ve dinamik bir yüksekliğe kaydetmek

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

Gelen didDeselectRowAtIndexPathsentinel değerine geri seçim endeksi ayarlanır ve normal forma hücre animasyon

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

        // sentinel
        self.currentSelection = -1;

        // animate
        [tableView beginUpdates];
        [tableView endUpdates];
    }
}
Cevap 05/08/2013 saat 17:02
kaynak kullanıcı

oy
12

animasyon olmadığından reloadData iyi değil ...

Bu şu anda çalışıyorum budur:

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

Neredeyse doğru çalışır. Neredeyse. Ben hücrenin yüksekliğini arttırarak ediyorum ve bazen hücre olarak tablo görünümünde küçük bir "hıçkırık" tablo görünümünde bazı kaydırma pozisyonu korunmuş ediliyor sanki değiştirilir, orada ilk hücresidir yeni hücre ( ) tablodaki ofset çok yüksek sonlanır ve Scrollview yeniden konumlandırmak için sıçrar.

Cevap 07/05/2009 saat 00:24
kaynak kullanıcı

oy
10

Ben çözümlenebilir reloadRowsAtIndexPaths.

Ben de tasarruf didSelectRowAtIndexPathseçilmiş ve çağrı hücrenin indexPath reloadRowsAtIndexPathssonunda (sen reload istediğiniz eleman en listesi için NSMutableArray gönderebilir).

In heightForRowAtIndexPathindexPath listesinde olup olmadığını expandIndexPath hücre en ve boy göndermek olmadığını kontrol edebilirsiniz.

Bu temel örneği kontrol edebilirsiniz: https://github.com/ferminhg/iOS-Examples/tree/master/iOS-UITableView-Cell-Height-Change/celdascambiadetam Bu basit bir çözüm.

Size yardımcı olursa ben kod bir tür eklemek

- (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];
}
Cevap 14/11/2014 saat 13:20
kaynak kullanıcı

oy
10

Ben arkaya beginUpdates / endUpdates çağıran bütün bu şeyler, sadece kullanabileceği başka bilmiyorum -[UITableView reloadRowsAtIndexPaths:withAnimation:]. İşte bir örnek projedir .

Cevap 02/08/2014 saat 23:52
kaynak kullanıcı

oy
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;
}
Cevap 15/08/2016 saat 16:32
kaynak kullanıcı

oy
2

özel hücre üzerinde "Detaylar" add ararken benim gibi biri için sadece bir not.

[tableView beginUpdates];
[tableView endUpdates];

Bir mükemmel çalışma yaptı ancak bunlarla "kırpma" hücre görünümü unutma. Interface Builder From Cell seçin -> İçerik Görünüm -> Mülkiyet Müfettişi gelen "seçeneğini Klip subview "

Cevap 25/03/2015 saat 20:08
kaynak kullanıcı

oy
2

Bu indexwise satır genişletilmesi içindir deneyin:

@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;
}
Cevap 24/09/2014 saat 06:41
kaynak kullanıcı

oy
1

Yerine beginUpdates()/ ' endUpdates(), önerilen çağrı artık şudur:

tableView.performBatchUpdates(nil, completion: nil)

Elma beginUpdates / endUpdates ilişkin, şöyle diyor: "performBatchUpdates (_ kullanın. Bunun yerine mümkün olduğunca bu bir tamamlanması :) yöntemi"

Bkz: https://developer.apple.com/documentation/uikit/uitableview/1614908-beginupdates

Cevap 19/11/2018 saat 16:47
kaynak kullanıcı

oy
1

İşte Swift 3. için Simons cevap daha kısa bir versiyonu da hücrenin seçimi toggle izin verir

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
  }
Cevap 30/05/2017 saat 23:36
kaynak kullanıcı

oy
1

Simon Lee'nin cevap Swift sürümü.

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

Daha sonra didSelectRowAtIndexPath bölgesindeki ()

  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()
            }
        }
    }
}
Cevap 07/06/2016 saat 15:30
kaynak kullanıcı

oy
0

4 Swift ve Üstü

Eğer Tableview en didselect satır temsilci yöntem haline kodunun altına ekleyin

tableView.beginUpdates()
tableView.setNeedsLayout()
tableView.endUpdates()
Cevap 23/11/2018 saat 11:53
kaynak kullanıcı

oy
0

Girdiler -

tableView.beginUpdates () tableView.endUpdates () bu işlevler aramayacağım

fonk tableView (_ tableView: UITableView, cellForRowAt indexPath: indexPath) -> UITableViewCell {}

Ama, sen yaparsanız tableView.reloadRows (en: [selectedIndexPath indexPath olarak!] Ile: hiç biri)

Bu arayacak fonk tableView (_ tableView: UITableView, cellForRowAt indexPath: indexPath) -> UITableViewCell {} Bu işlev.

Cevap 28/03/2018 saat 11:08
kaynak kullanıcı

oy
0

Swift versiyonu Simon Lee'nin cevap :

tableView.beginUpdates()
tableView.endUpdates()

Eğer yükseklik özelliklerini değiştirmek gerektiğini unutmayın ÖNCE endUpdates() .

Cevap 08/02/2018 saat 14:11
kaynak kullanıcı

oy
0

Evet mümkün.

UITableView bir temsilci yöntemi vardır 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) {
    }];
}

Ama senin durumunda kaydırdığı ve farklı bir hücreyi seçer sonra u küçültmek ve seçili hücreyi genişletmek için son seçilen hücreyi olması gerekiyorsa reloadRowsAtIndexPaths:aramaları heightForRowAtIndexPath:buna göre ele.

Cevap 01/08/2016 saat 11:29
kaynak kullanıcı

oy
0

iOS 7 ve üstü sonra bu yöntemi edin.

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

İyileştirmeler Biz tablo görünümünde kendisinin özelliği olarak ayarlayabilirsiniz iOS 8'de bu yapılmıştır.

Cevap 04/03/2016 saat 12:10
kaynak kullanıcı

oy
0

Joy'un müthiş cevap @ kullanılan ve ios 8.4 ve XCode 7.1.1 ile mükemmel çalıştı.

Eğer cep geçiş-muktedir hale getirmeye çalışıyoruz, şu kadar -tableViewDidSelect değiştirdi:

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

}

Bunların hiçbirini size yardımcı umut.

Cevap 19/11/2015 saat 21:00
kaynak kullanıcı

oy
0

Burada, özel benim kodudur UITableViewgenişletmek alt sınıf, UITextViewyeniden (ve kayıp klavye odağı) olmadan tablo hücresinin de:

- (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;
}
Cevap 10/11/2015 saat 02:14
kaynak kullanıcı

oy
-1

Biraz kesmek ile bu sorunu çözüldü:

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

Ben set hücre yüksekliğini genişletmek için gerektiğinde isInEdit = YESve yöntemini çağırın [self onTimer]ve s_CellHeightEditing değere erişene kadar o :-) hücre büyümesini canlandıran

Cevap 20/08/2009 saat 21:18
kaynak kullanıcı

oy
-1

Seçilen satırın indexPath alın. tabloyu yeniden yükleyin. UITableViewDelegate arasında heightForRowAtIndexPath yöntemde, farklı bir yüksekliğe ve diğerleri için seçilen satır yüksekliği, normal satır yüksekliği geri ayarlamak

Cevap 21/01/2009 saat 16:13
kaynak kullanıcı

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