【问题标题】:Choppy UIView animation断断续续的 UIView 动画
【发布时间】:2011-11-15 00:49:21
【问题描述】:

我使用 UIView 动画在屏幕周围随机设置 5 个方块 (UIButtons)。根据用户的选择,可以看到 2 到 5 个正方形。当只有 2 个可见时,其他三个的隐藏值设置为 YES,因此它们实际上仍在动画中(对吗?),它们只是不可见。但是当只有 2 个可见时,动画是平滑的,但是当所有 5 个都可见时,动画会变得不稳定。我不确定如何描述它,因为方块仍在以正确的速度移动并移动到正确的点;波涛汹涌并不可怕,只是糟糕到足以引起注意。有没有办法摆脱它?这是我用来为正方形设置动画的代码:

编辑:将动画更改为阻止:

[UIView animateWithDuration:animationSpeed 
                              delay:0 
                            options:UIViewAnimationOptionCurveLinear 
                         animations:^{
                             view.center = destPoint;
                         }
                         completion:^(BOOL finished){
                             if([view isEqual:squareThree])
                                 [self moveBadGuys];
                         }
         ];

/*for(UIButton* button in squareArray) {
    if(!shouldMove)
        return;

    [UIView beginAnimations:@"b" context:nil];
    [UIView setAnimationDuration:animationSpeed];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    view.center = destPoint;
    [UIView commitAnimations];
}*/

编辑:呈现这个的视图是三个 UIViewController 堆栈中的第三个

ViewController* controller = [[[ViewController alloc] init] autorelease];
[self presentModalViewController:controller animated:NO];

这种呈现视图的方式会占用内存吗?

【问题讨论】:

  • 会不会是你内存不足?
  • 我是这么想的,我不太了解 iPhone 必须使用多少内存,或者创建单个 IBOutlet 会消耗多少资源,但我确实有很多该视图控制器中的 IBOutlets
  • 不,呈现视图的方式不会占用内存。尝试一次只做一个动画,而不是 for 语句,看看是否仍然出现断断续续的情况。
  • 是的,这停止了波动,这对我来说没有意义,因为即使只有两个方格在移动(而且并不波动),其他方格也被隐藏了,但仍在移动,对吧?
  • 我有点困惑,这解决了你的问题吗?如果没有,如果你想让不可见的物体移动到一个特定的点,不要动画它,只做 CGPointMake。

标签: ios core-animation uiviewanimation quartz-core


【解决方案1】:

有几件事会导致这种情况。它总是归结为内容的复杂程度。此外,模拟器在处理动画方面可能非常糟糕,因此请确保您在真实硬件上进行测试。

按钮上有大图吗?按钮是否投射阴影?这些事情会减慢它的速度。

还使用基于块的动画。不是旧的开始提交方法。

【讨论】:

  • 好的,我将它们更改为阻止。但是不,它们没有阴影或复杂的图像;它们是可靠的 UIColors,是的,我正在真实硬件上进行测试。在模拟器上的性能实际上要好得多,这让我相信问题出在内存(计算机的内存要多得多)
  • 使用 begin-commit 代替 block 实际上不会影响性能,对吧?
  • 永远不要相信模拟器的性能——它的特性与设备的特性完全不同。您的计算机有更多内存,是的,但它也有更快的 CPU 和 GPU。
  • 是的,但这让我回到了原来的问题。看来内存肯定是问题所在。但是在这种情况下如何节省内存呢?
【解决方案2】:

不完全确定为什么它很慢,但是您是否尝试过不同的嵌套方式?

if(!shouldMove)
    return;

[UIView beginAnimations:@"b" context:nil];
[UIView setAnimationDuration:animationSpeed];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

for(UIButton* button in squareArray) {
    view.center = destPoint;
}

[UIView commitAnimations];

确实(几乎 - 在!shouldMove 案例中的逻辑有点不同,但这是一个不同的故事)相同,但方式更简洁。

【讨论】:

  • 虽然这看起来确实更干净,但它会将所有方块移动到同一点,这有点违背了拥有多个方块的目的:D
  • 运动部分是等效的。您显示的代码也是如此。
  • 哦,对不起!在我的代码中,我没有显示我为 each UIButton 获得了不同的随机点;我不认为这是相关的。但是,是的,你是对的,这段代码相当于我发布的代码。对不起!
猜你喜欢
  • 1970-01-01
  • 2011-02-27
  • 2016-12-24
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 2012-02-08
  • 2010-09-23
  • 2011-02-15
相关资源
最近更新 更多