在动画块之外使用更改时,UIView transitionWithView是平滑的

时间:2016-10-30 08:46:22

标签: ios animation uiview reloaddata

我正在重新加载UITableview的数据,因为行数,部分和行高度发生了显着变化。为了缓和过渡,我在点击按钮时选择了下面的过渡。如果我将reloadData和/或内容偏移代码放在动画块中,结果是“hacky”/“stuttering”。如果我在动画之前放置视图更改,它就像梦一样。 为什么这样做?我是否使用transitionWithView(iOS 10.1)的错误行为。该如何正确完成?

[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];

1 个答案:

答案 0 :(得分: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)]

您可以选择多个选项来动画将新数据添加到tableView。基本上,您将新数据添加到在表视图中显示的对象数组中,然后调用此方法以显示您所做的更改。 另一方面,您可以尝试其他方法

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

在上述两种情况下,您不需要调用[tableView reloadData],因为它们都可以自行完成。