【发布时间】: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:的调用,它在我的复制/粘贴/编辑中被破坏了。