【问题标题】:UIView animation only animating some of the things I ask it toUIView 动画只动画我要求它做的一些事情
【发布时间】:2010-03-24 08:17:10
【问题描述】:

我在屏幕上连续有一系列(比如说)框,我的主视图的所有子视图。每个都是一个 UIView。我想将它们全部向左移动并有一个新视图也从右侧同步进入屏幕。这就是我正在做的事情:

// First add a dummy view offscreen
UIView * stagingView = /* make this view, which sets up its width/height */
CGRect frame = [stagingView frame];
frame.origin.x = /* just off the right side of the screen */;
[stagingView setFrame:frame];
[self addSubview:stagingView];

然后我在一个块中为我的所有子视图(包括我刚刚添加的那个)设置了动画:

[UIView beginAnimations:@"shiftLeft" context:NULL];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(_animationDidStop:context:)];        
[UIView setAnimationDuration:0.3];
for (UIView * view in [self subviews]) {
    CGRect frame = [view frame];
    frame.origin.x -= (frame.size.width + viewPadding);
    [view setFrame:frame];
}
[UIView commitAnimations];        

这就是我所期望的:已经在屏幕上的(三个)视图向左移动,而新上演的视图同时从右侧进入。

发生的情况如下:新上演的视图完全按照预期进行动画处理,而屏幕上的视图似乎根本没有移动! (或者他们可能会在没有动画的情况下跳转到它们的结束位置)。

还有!如果我注释掉在屏幕外创建新​​子视图的整个业务......屏幕上的那些动画正确!

嗯?

更新:经过一番摸索,我发现了一些令人惊奇的事情:如果在动画之间调用它,我可以通过让我的 layoutSubviews 的自定义子类返回而不做任何工作来解决这个问题已设置,以及完成的时间。该方法需要做一些工作以在方向更改期间调整这些子视图的位置。但是我并不真正理解动画与这种方法的相互作用——我认为它最终可能会在最后被调用,这是有道理的,并且在动画之后本质上应该是无操作的。谁能给我解释一下互动?看来我已经接近启蒙了,但还没有完全达到。谢谢!

【问题讨论】:

  • 我看到了您的问题 - 您正在使用 cmets,您的视图初始化和 frame.origin.x 声明应该是! :) 但说真的,add-view 块中的最后一行:应该是[self stagingView];,还是你错过了什么(比如对addSubview: 的调用)?
  • 什么是 [self stagingView];做?你在哪里添加 stagingView 作为子视图? “或者他们可能会在没有动画的情况下跳到他们的终点”你能澄清一下吗?他们会动还是不动?
  • 呃,是的,错字已修复。 :) 当然,那是对addSubview: 的调用,它在我的复制/粘贴/编辑中被破坏了。

标签: iphone animation uiview


【解决方案1】:

和评论者一样,我很好奇你为什么会打电话给

[self stagingView];

我想这是因为你试图触发 drawRect:。我还想知道为什么您没有在示例代码中将其添加为子视图,尽管我想您已经在某处完成了。

我有两件事可能会有所帮助:

1.不要单独为“盒子”设置动画。为它们创建一个容器视图,然后为容器视图设置动画。简单!

2.不要依赖[查看子视图]才能正常工作。保留您自己想要移动的框数组(一个 ivar)并对其进行迭代。

【讨论】:

  • 呃,是的,SO post 压缩中的拼写错误——事实上,该调用是对addSubview: 的调用——已修复!感谢您的建议。将尝试其中一项或两项;虽然我不知道为什么我不能相信[view subviews]——这应该是这里的真相。
  • 应该,只是防止用户出错。例如,如果您决定稍后为不同的目的添加子视图。
  • 感谢您的关注。我注意到问题正文中的更新/修复 - 你知道为什么该修复有效吗?谢谢。
  • 嗯,你的视图不在屏幕上,UIKit 喜欢通过没有真正正确地绘制它们来优化它们,或者根本不正确地绘制它们,有时(它不是真正记录的行为)。但是调用 layoutSubviews 或 setNeedsDisplay 等方法有时会帮助正确渲染屏幕外视图。
  • 给你正确的答案,因为你花时间提供你的想法。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多