Мне не нужна анимация в блоке начала обновлений и конца обновлений для 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];
}];

Swift

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

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)внутрь доработанный блок.
Лассе Банк

Но это не обновляет нижний колонтитул, пока вы не прокрутите табличное представление.
Мистер Бин

@ Мистер Бин, что за дело? (т.е. всегда ли в вашем tableview есть нижний колонтитул, вы пытаетесь вставить его или удалить?)
Нил Джафта

Всегда имейте нижний колонтитул, просто нужно обновить нижний колонтитул (т.е. внутри
г-н Бин

@ Mr.Bean, что содержит ваш блок обновления? Наиболее расширяемым методом здесь было бы перезагрузка раздела.
Нил Джафта

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.