Мне не нужна анимация в блоке начала обновлений и конца обновлений для 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
HSTDT
источник
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)
Aadi007
источник