2016-10-30 5 views
0

Я перезагружаю данные UITableview, потому что число строк, секций и высот строк резко меняется. Чтобы смягчить переход, я выбрал переход ниже при нажатии кнопки. Если я поместил код reloadData и/или код смещения содержимого внутри блока анимации, результат будет «взломанным»/«заикающимся». Если я помещаю изменения вида перед анимацией, это работает как сон. Почему это работает? Я использую ошибочное поведение переходаWithView (iOS 10.1). Как это должно быть сделано правильно?UIView transitionWithView является гладким при использовании изменений вне блока анимации

[self.tableView reloadData]; 
CGPoint bottomOffset = CGPointMake(0, [self.tableView contentSize].height + [self.tableView contentInset].bottom - self.tableView.frame.size.height); 
[self.tableView setContentOffset:bottomOffset animated:NO]; 

[UIView transitionWithView: self.tableView 
          duration: 0.35f 
          options: UIViewAnimationOptionTransitionCrossDissolve 
         animations: ^(void) 
         { 
         } 
         completion: nil]; 

ответ

0

transitionWithView обычно используется для изменения всего вида экрана, а не отображения изменений в некоторых его частях. Как Apple говорит:

Переходная анимация меняет содержимое одного контроллера вида для содержимого другого.

поэтому в большинстве случаев, для работы с простой анимации рекомендуется использовать

[UIView animateWithDuration:(NSTimeInterval) animations:^(void)animations completion:^(BOOL finished)completion] 

или же есть другой способ, чтобы оживить ваши взгляды

[UIView beginAnimations:(nullable NSString *) context:(nullable void *)] 
//place your view changes here to animate it 
//...... 
[UIView commitAnimations] 

Также существует метод что tableView имеет

[tableView insertRowsAtIndexPaths:(nonnull NSArray<NSIndexPath *> *) withRowAnimation:(UITableViewRowAnimation)] 

с количеством вы можете выбрать анимировать добавление новых данных в таблицуView. Таким образом, в основном вы добавляете новые данные в массив объектов, отображаемых в виде таблицы, и затем вызываете этот метод для отображения внесенных изменений. С другой стороны, вы можете попробовать другой метод,

[tableView beginUpdates]; 
//make some changes 
[tableView endUpdates]; 

В этих двух случаях выше вам не нужно звонить [Tableview reloadData], потому что они все работают сами.

+0

Спасибо за ответ. Однако проблема в том, что animateWithDuration не работает плавно вообще (вскакивает и, вероятно, из-за смещения содержимого, а не просто затухает и выходит, как это делает crossdisolve. Если я использую changeWithView и устанавливаю представление в tableview или просто просмотр контроллеров, он работает хорошо, если исключить изменения в блоке анимации. Любые идеи? – damcify

+0

@damcify отредактирован с помощью некоторых новых подходов. надеюсь, что некоторые из них помогут вам в решении вашей проблемы – valivaxa