Objective c iOS核心动画加速

Objective c iOS核心动画加速,objective-c,ios,ios5,core-animation,transition,Objective C,Ios,Ios5,Core Animation,Transition,我正在尝试使用不同的动画将一个复杂视图替换为另一个复杂视图,例如移动到左/右/上/下。第一视图和第二视图包含30-40个子视图(按钮)。我的代码如下: oldView.alpha = 1; newView.alpha = 0; oldView.frame = CGRectMake(0, 0, width, height); newView.frame = CGRectMake(0, -height, width, height); // begin animation // setting d

我正在尝试使用不同的动画将一个复杂视图替换为另一个复杂视图,例如移动到左/右/上/下。第一视图和第二视图包含30-40个子视图(按钮)。我的代码如下:

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模拟器和iPhone4S上运行良好,但在iPhone4上运行滞后。我说的滞后是指每秒12-15帧

如何加速此动画

  • 我应该使用
    center
    属性而不是
    frame
  • 我是否应该将视图渲染到
    UIImageView
    ,并设置它们的动画
  • 我是否应该在
    UIScrollView
    中布局视图并调用
    scrollRectToVisible:animated:

请解释一下为什么我的动画代码这么慢?当我的两个视图包含10-20个按钮时-速度没有问题…

您需要发布更多代码,因为设置新帧不会对性能造成太大影响。但是,您可以使用视图的
drawRect:
执行一些操作,这会大大降低绘图和动画的速度

例如:

myView.layer.shadowOffset = CGSizeMake(0.0, 10.0);
myView.layer.shadowRadius = 10;
myView.layer.shadowOpacity = 0.40;
这会在视图中添加一个漂亮的阴影,这将终止动画。因此,在本例中,我在设置动画时关闭阴影,完成后再次打开阴影

如果看不到更多的代码,就不可能说出问题所在

编辑:


要加快阴影的渲染速度,可以将
shouldRasterize
属性设置为
YES
。这将强制层创建阴影位图,而不是尝试每帧重新绘制一次。请尝试以下操作之一:

  • 改变中心而不是框架
  • 使用“变换”属性而不是“帧”
    oldView.transform=CGAffineTransformMakeTransform(0,高度)

要添加的是,如果您正在使用显式动画,但仍在设置可设置动画的属性,则需要使用以下方法禁用隐式动画:

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

“我的视图”有7*5个按钮矩阵,采用粗体系统字体,只有
阴影偏移量(0,1)
。我正在尝试实现自定义日历控件。为了进行测试,请去掉阴影,看看这是否会提高性能。如果是,您可以使用shouldRasterize属性并将其设置为yes。这将停止在每一帧重新绘制阴影。您的意思是应该光栅化每个按钮标题层的属性吗?有趣的属性…我今天晚上会尝试这种方式。好的,我们需要进一步缩小范围。你把阴影完全去掉了吗?如果是这样的话,这会加快速度吗?好的,我今晚就试试。也许你可以推荐任何关于核心动画属性性能的文章?这不是核心动画。CoreAnimation是关于处理直接CALayer动画的。您正在谈论UIView动画:但是,请记住,更改视图的帧将触发setNeedsDisplay,从而从文档中获得完整的视图重画:更改帧矩形将自动重新显示接收器,而无需调用
drawRect:
方法。如果希望在框架矩形更改时调用drawRect:方法,请将
contentMode
属性设置为
UIViewContentModeRedraw