Я не хочу анимацию в начале обновления, конец блока обновления для uitableview? - PullRequest
79 голосов
/ 16 февраля 2012

У меня есть UITableView, который использует пользовательскую ячейку таблицы, и у каждой ячейки есть UIWebView.

Поскольку загрузка UIWebView заняла много времени, я хочу избежать их перезагрузки любой ценой. В некоторых ситуациях у меня загружены все ячейки, но их высота перепутана. Поэтому мне нужно «ретранслировать» таблицу, не вызывая функцию «cellForRow».

  1. Я определенно не могу использовать reloadData ... так как он снова перезагрузит ячейки.
  2. Я пробовал tableView.setNeedDisplay, setNeedsLayout и т. Д., Ни один из них не может переставить ячейки таблицы
  3. Единственный способ, которым это сработало, это вызвать блок beginupdates / endupdates, этот блок может ретранслировать мою таблицу без запуска cellForRow! НО, я не хотел анимацию! Этот блок производит анимационный эффект, но я не хочу его ...

Как мне решить мою проблему?

Ответы [ 6 ]

200 голосов
/ 16 февраля 2012
[UIView setAnimationsEnabled:NO];
[tableView beginUpdates];
[tableView endUpdates];
[UIView setAnimationsEnabled:YES];
50 голосов
/ 04 февраля 2016

Еще один способ сделать это, используя блоки

Obj-C

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

Swift

UIView.performWithoutAnimation {
    tableView.beginUpdates()
    tableView.endUpdates()   
}
4 голосов
/ 31 августа 2018

работает над моим проектом, но не является общим решением.

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 голосов
/ 05 октября 2015

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()
1 голос
/ 22 сентября 2016

Я предпочитаю плавный переход:

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 голосов
/ 01 апреля 2016

Я хотел обновить высоту ячейки для раздела 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...