2010-11-04 148 views
1

首先,我在iOS开发方面有很多经验,但我并不那么热衷于Core Animation。我想在Safari浏览器(包括iPhone和iPad)中重现这种效果,当您查看的页面缩小并缩小到缩略图视图时,并且在选择给定的缩略图后,它会“放大”,然后相应的页面被恢复。iPad Safari类似放大缩小视图

什么是实现这一目标的最佳方式是什么?我将它应用到一个reguiar UIView子类 - 不是一个UIWebView - 但我不太确定如何做整个缩小效果,并指定缩小的缩略图的目标框架(假设我有很多缩略图在屏幕上和我想将当前的观点放入一个特定的缩略图中)。

最佳,

回答

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上的东西(例如地图视图或Web视图),那么该视图将变成其背景颜色,并且可能不会再次淡入,直到动画完成。同样,任何决定如何基于框架大小绘制的视图都不会按比例缩放,而只是改变大小。

+0

嗨汤米,谢谢你的详细回复。我一直在使用UIView动画来做一些基本的东西,以及CATransition,这就是我对CoreAnimation的体验结束的地方。我从来没有碰过的是视图转换属性,主要是因为我没有机会真正理解它。但根据你的建议,它看起来并不复杂,似乎是做我要找的东西的方法。现在怎么样转换到缩略图视图?我可以在同一个动画块中添加它作为子视图,初始alpha值为0并增加它吗? – boliva 2010-11-12 15:05:36

+0

作为子视图添加立即生效,无论是在动画块内部还是外部,但alpha都是动画属性,因此应该可以安全地将其添加为alpha,然后将alpha设置为1以便平滑过渡。 – Tommy 2010-11-12 15:57:20