2012-07-03 125 views
0

我想用另一个复杂的视图替换一个复杂的视图,使用不同的动画,如移动到左/右/顶部/底部。第一个和第二个视图包含30-40个子视图(按钮)。我的代码是这样的:iOS核心动画加速

oldView.alpha = 1; 
newView.alpha = 0; 
oldView.frame = CGRectMake(0, 0, width, height); 
newView.frame = CGRectMake(0, -height, width, height); 

// begin animation 
// setting duration 0.3 
// ... 

oldView.alpha = 0; 
newView.alpha = 1; 
oldView.frame = CGRectMake(0, height, width, height); 
newView.frame = CGRectMake(0, 0, width, height); 

// commit animation 
// ... 

它可以很好的对iPhone模拟器iPhone 4S的,但是它滞后于iPhone 4。迟到我的意思是12-15 FPS。

我该如何加快这个动画?

  • 我应该使用center属性而不是frame
  • 我是否应该将视图渲染到UIImageView并对其进行动画制作?
  • 我是否应该在UIScrollView中布置我的视图并致电scrollRectToVisible:animated:

请解释我为什么我的动画代码如此缓慢?当我的两个视图中包含10-20个按钮时 - 速度没有问题...

回答

1

您需要发布更多的代码,因为设置新帧的性能不应该太高。然而,有些事情可以通过您的视图layerdrawRect:来完成,这会使绘图和动画显着减慢。

例如:

myView.layer.shadowOffset = CGSizeMake(0.0, 10.0); 
myView.layer.shadowRadius = 10; 
myView.layer.shadowOpacity = 0.40; 

增加了一个不错的阴影到视图将杀死动画。所以在这种情况下,我会在制作动画时关闭阴影,并在完成后再次打开阴影。

没有看到更多的代码,就不可能说出问题出在哪里。

编辑:

要加快阴影的渲染,你可以在shouldRasterize属性设置为YES。这迫使图层创建阴影的位图,而不是尝试每一帧都重绘它。

+0

我的意见有7 * 5矩阵按钮粗体系统字体只有'shadowOffset(0,1)'。我正在尝试实现自定义日历控件。 – k06a

+0

为了测试,请取下阴影,看看这是否可以提高性能。如果是这样,您可以使用shouldRasterize属性并将其设置为yes。这会停止每帧重新调整的阴影。 –

+0

你是指每个按钮标题图层的shouldRasterize属性?有趣的财产... – k06a

1

尝试使用以下中的一个:

变换,而不是框架属性
  • 变化中心的,而不是帧
  • 使用。 oldView.transform = CGAffineTransformMakeTranslation(0, height);
+0

好的,我今天晚上会试一下。也许你可以建议任何关于核心A的文章nimation属性的性能? – k06a

+0

这不是CoreAnimation。 CoreAnimation是关于直接处理CALayer动画的。您正在讨论关于UIView动画:http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/AnimatingViews/AnimatingViews.html#//apple_ref/doc/uid/TP40009503-CH6-SW1 – javieralog

+0

但是,请记住,更改视图的框架将触发setNeedsDisplay,从而完全重绘视图 – javieralog

0

我想补充,如果你正在使用显式的动画,但仍设置动画的属性,你会希望通过使用禁用隐式动画:

[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];