У меня есть UITableView, который использует настраиваемую ячейку таблицы, и каждая ячейка имеет UIWebView.
Поскольку для загрузки UIWebView потребовалось время, я хочу избежать их перезагрузки любой ценой. В некоторых случаях у меня загружены все ячейки, но их высота перепуталась. Следовательно, мне нужно «ретранслировать» таблицу без запуска функции «cellForRow».
- Я определенно не могу использовать reloadData ... так как он снова перезагрузит ячейки.
- Я пробовал tableView.setNeedDisplay, setNeedsLayout и т. Д., Ни один из них не может переставить ячейки таблицы
- Единственный способ, которым это сработало, - это вызвать блок beginupdates / endupdates, этот блок может ретранслировать мою таблицу без запуска cellForRow! НО мне не нужна анимация! Этот блок производит эффект анимации, но я не хочу этого ...
Как я могу решить свою проблему?
UITableViewRowAnimationNone
, но с этим анимацию можно легко обойти!Еще один способ сделать это с помощью блоков
Obj-C
[UIView performWithoutAnimation:^{ [self.tableView beginUpdates]; [self.tableView endUpdates]; }];
Swift
UIView.performWithoutAnimation { tableView.beginUpdates() tableView.endUpdates() }
источник
работаю над своим проектом, но это не общее решение.
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
источник
Swifties Чтобы это сработало, мне пришлось сделать следующее:
// 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)
внутрь доработанный блок.Я предпочитаю плавный переход:
CGPoint offset = self.tableView.contentOffset; [UIView transitionWithView:self.tableView duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ [self.tableView reloadData]; self.tableView.contentOffset = offset; } completion:nil];
попробуйте.
источник
Я хотел обновить высоту ячейки для раздела 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)
источник