首先,我在iOS开发方面有丰富的经验,但我并不热衷于核心动画。我希望在您正在查看的页面收缩时自动缩小Safari(iPhone和iPad)中的效果并“缩小”到缩略图视图中,然后在选择给定的缩略图后,它会'放大'并且相应的页面将被恢复。
实现这一目标的最佳方法是什么?我将它应用于一个reguiar UIView子类 - 而不是一个UIWebView - 但我不太确定如何做整个收缩效果,并指定缩小缩略图的目标框架(假设我在屏幕上有很多缩略图,我想将当前视图定位到特定的缩略图中。
最佳,
答案 0 :(得分:2)
它可能是一个简单的CoreAnimation效果,调整视图变换而不是帧。这应该适用于任何类型的观点。我很乐观你缺乏敏感性而不是真正的不喜欢,所以我会继续使用CoreAnimation的答案,以防它有用......
UIView有一个非常好用的方法来设置动画。例如,要将视图的动画缩小到一半大小,将其置于同一位置的中心位置:
[UIView beginAnimations:nil context:nil];
view.transform = CGAffineTransformMakeScale(0.5f, 0.5f);
[UIView commitAnimations];
缩小它并将其中心向右移50个像素:
[UIView beginAnimations:nil context:nil];
view.transform = CGAffineTransformTranslate(CGAffineTransformMakeScale(0.5f, 0.5f), 50.0f, 0.0f);
[UIView commitAnimations];
并从任一州恢复正常:
[UIView beginAnimations:nil context:nil];
webView.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
[UIView commitAnimations];
背后的理论是视图的某些属性是可动画的。这些属性是CoreAnimation能够作为正在进行的动画的一部分自行调整的属性。 UIView类方法beginAnimations:context:和commitAnimations设置然后开始CoreAnimation块。实质上,您在beginAnimations:context:之后对可动画属性所做的每个更改都不会立即生效,而是设置为动画的目标状态。执行commitAnimations时,会发生动画。
通过UIView便捷方法,您可以使用许多其他控件来调整动画,所有这些都在UIView文档中进行了描述。
如果您不使用CoreAnimation,那么您必须自己对变换进行逐帧调整,尽管我认为这种方法没有任何好处 - 它会让您花费更多CPU条款并不太可能接近顺畅。
如果可以的话,绝对坚持变换而不是调整框架;调整转换会更改视图添加到屏幕的方式。它不会导致视图本身重绘。因此,如果您更改比例,那就像缩放视图的图像一样。如果您更改框架或边界,那么iOS将丢弃其当前视图的外观缓冲区并请求重绘,这会花费更多。更糟糕的是,如果你有任何东西坐在CATiledLayer上(例如地图视图或网页视图),那么视图将变成其背景颜色,并且可能在动画完成之前不再淡入。同样,任何根据帧大小决定如何绘制的视图都不会按比例缩放,只是为了改变大小。