首先,我在iOS开发方面有丰富的经验,但是我对Core Animation不太热衷。我要在Safari(iPhone和iPad)上重现该效果,即您正在查看的页面会自动收缩并“缩小”为缩略图视图,然后在选择了给定的缩略图之后,然后“放大”并相应的页面被还原。
做到这一点的最佳方法是什么?我会将其应用于常规的UIView子类-而不是UIWebView-但我不确定如何实现整体缩小效果,并不确定缩小缩略图的目标框架(假设我在屏幕上有很多缩略图,我想将当前视图放置到特定的缩略图中。
最好,
最佳答案
它可能是一个简单的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上(例如 map 视图或Web视图),则该视图将变为其背景颜色,并且可能直到动画完成后才再次淡入。同样,任何根据帧大小决定如何绘制的视图都不会缩放,而只会更改大小。