Başlangıç ​​güncellemelerinde animasyon istemiyorum, uitableview için son güncellemeler engelle?


89

Özel bir tablo hücresi kullanan bir UITableView var ve her hücre bir UIWebView'a sahip.

UIWebView'un yüklenmesi uzun zaman aldığından, her ne pahasına olursa olsun yeniden yüklemekten kaçınmak istiyorum. Bazı durumlarda, tüm hücrelerimi yükledim, ancak yükseklikleri bozuk. Bu nedenle, "cellForRow" işlevini tetiklemeden tabloyu "aktarmam" gerekiyor.

  1. Hücreleri yeniden yükleyeceği için kesinlikle reloadData kullanamıyorum.
  2. TableView.setNeedDisplay, setNeedsLayout vb. Denedim, hiçbiri tablo hücrelerini yeniden düzenleyemiyor
  3. Çalışmasının tek yolu, beginupdates / endupdates bloğunu çağırmaktır, bu blok, cellForRow! AMA, animasyonu istemedim! Bu blok bir animasyon efekti yaratıyor ama ben istemiyorum ...

Sorunumu nasıl çözebilirim?

Yanıtlar:


217
[UIView setAnimationsEnabled:NO];
[tableView beginUpdates];
[tableView endUpdates];
[UIView setAnimationsEnabled:YES];

1
Bu harika! Bazı en ilginç uygulamalara sahip olduğunu düşünüyorum. Bölümleri yeniden yükleme yönteminin içeri girseniz bile her zaman canlandırılacağını öğrendim UITableViewRowAnimationNone, ancak bununla animasyon kolayca atlanabilir!
Flying_Banana

65

Blokları kullanarak yapmanın bir yolu daha

Obj-C

[UIView performWithoutAnimation:^{
   [self.tableView beginUpdates];
   [self.tableView endUpdates];
}];

Swift

UIView.performWithoutAnimation {
    tableView.beginUpdates()
    tableView.endUpdates()   
}

4

projem üzerinde çalışıyorum, ancak ortak bir çözüm değil.

let loc = tableView.contentOffset
UIView.performWithoutAnimation {

    tableView.reloadData()

    tableView.layoutIfNeeded()
    tableView.beginUpdates()
    tableView.endUpdates()

    tableView.layer.removeAllAnimations()
}
tableView.setContentOffset(loc, animated: true)//animation true may perform better

3

Swifties Bunun işe yaraması için şunları yapmam gerekiyordu:

// Sadly, this is not as simple as calling:
//      UIView.setAnimationsEnabled(false)
//      self.tableView.beginUpdates()
//      self.tableView.endUpdates()
//      UIView.setAnimationsEnabled(true)

// We need to disable the animations.
UIView.setAnimationsEnabled(false)
CATransaction.begin()

// And we also need to set the completion block,
CATransaction.setCompletionBlock { () -> Void in
    // of the animation.
    UIView.setAnimationsEnabled(true)
}

// Call the stuff we need to.
self.tableView.beginUpdates()
self.tableView.endUpdates()

// Commit the animation.
CATransaction.commit()

Bana yardımcı oldu. Teşekkürler. setAnimationsEnabled(true)Tamamlama bloğunun içine koymak önemlidir.
Lasse Bunk

Ancak bu, siz tablo görünümünü kaydırana kadar Altbilgiyi güncellemez.
Mr. Bean

@ Mr.Bean tam durum nedir? (yani, tablo görünümünüzün her zaman bir altbilgisi var mı, birini eklemeye mi yoksa kaldırmaya mı çalışıyorsunuz?)
Neil Japhtha

Her zaman bir Altbilgiye sahip olun, yalnızca altbilgiyi güncellemeniz gerekir (ör. Altbilginin içinde 2 görünüm vardır, duruma bağlı olarak görünümleri gizlemeniz / göstermeniz gerekir.)
Mr. Bean

@ Mr.Bean güncelleme bloğunuz ne içeriyor? Buradaki en genişletilebilir yöntem bölümü yeniden yüklemek olacaktır.
Neil Japhtha

1

Yumuşak bir geçiş yapmayı tercih ederim:

CGPoint offset = self.tableView.contentOffset;
[UIView transitionWithView:self.tableView duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
        [self.tableView reloadData];
        self.tableView.contentOffset = offset;
    } completion:nil];

bir şans ver.


0

Bölüm 5 için hücre yüksekliğini güncellemek istedim ve aşağıdaki kod benim için çalıştı:

UiView.setAnimationsEnabled(False)
self.productTableView.reloadSections(NSIndexSet(index: SectionType.ProductDescription.hashValue), withRowAnimation: UITableViewRowAnimation.None)
self.productTableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 5), atScrollPosition: UITableViewScrollPosition.Bottom, animated: false)
UIView.setAnimationsEnabled(true)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.