Я не хочу, щоб анімація починалася з оновлення, блокувала кінцеві оновлення для uitableview?


89

У мене є UITableView, який використовує спеціальну комірку таблиці, і кожна комірка має UIWebView.

Оскільки UIWebView витрачав час на завантаження, я хочу уникнути перезавантаження їх будь-якою ціною. У деяких ситуаціях я завантажую всі клітини, але їх висота переплутана. Тому мені потрібно «передати» таблицю, не запускаючи функцію «cellForRow».

  1. Я точно не можу використовувати reloadData ..., оскільки він перезавантажить комірки знову.
  2. Я спробував tableView.setNeedDisplay, setNeedsLayout тощо, жоден з них не може переставити комірки таблиці
  3. Єдиний спосіб, як це працювало, - це виклик блоку beginupdates / endupdates, цей блок може ретранслювати мою таблицю, не запускаючи cellForRow! АЛЕ, я не хотів анімації! Цей блок створює ефект анімації, але я не хочу цього ...

Як я можу вирішити свою проблему?

Відповіді:


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

1
Це чудово! Я вважаю, що в ньому є найцікавіші програми. Я виявив, що метод перезавантаження розділів завжди оживить, навіть якщо ви пройдете UITableViewRowAnimationNone, але за допомогою цього анімацію можна легко обійти!
Flying_Banana

65

Ще один спосіб зробити це за допомогою блоків

Obj-C

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

Стрімкий

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

4

працює над своїм проектом, але не є загальним рішенням.

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

Свіфті, мені довелося зробити наступне, щоб це працювало:

// 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()

Мені допомогло. Дякую. Важливо помістити setAnimationsEnabled(true)всередину блоку завершення.
Лассе Банк,

Але це не оновлює нижній колонтитул, доки ви не прокрутите табличний перегляд.
Містер Бін,

@ Mr.Bean, у чому вся справа? (тобто, чи завжди у вашому погляді таблиці є нижній колонтитул, ви намагаєтесь вставити його або видалити?)
Ніл Яфта

Завжди майте нижній колонтитул, потрібно лише оновити нижній колонтитул (тобто в колонтитулі є 2 подання, потрібно приховати / показати подання залежно від стану.)
Містер Бін,

@ Mr.Bean, що містить ваш блок оновлення? Найбільш розширюваним методом тут було б перезавантажити розділ.
Neil Japhtha

1

Я віддаю перевагу плавному переходу:

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

спробувати.


0

Я хотів оновити висоту комірки для розділу 5, і для мене працював наступний код:

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.