我在屏幕上连续显示了一系列(比方说)方框,这是我主视图的所有子视图。每个都是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
的自定义子类返回而不做任何工作来解决问题,如果它在时间之间调用动画已设置,完成时间。该方法需要做一些工作来调整方向更改期间这些子视图的位置。但是我并不真正理解动画与这种方法的相互作用 - 我认为它最终可能会在最后被调用,这将是有意义的,并且在动画之后应该基本上是无操作。谁能向我解释这种互动?似乎我接近启蒙,但还没有到那里。谢谢!
答案 0 :(得分:1)
与评论者一样,我很好奇为什么要打电话给
[self stagingView];
我想是因为你试图触发drawRect:我也想知道为什么你没有在示例代码中将它添加为子视图,尽管我想你已经在某个地方完成了它。
我有两件事可能会有所帮助:
1.不要单独为“盒子”制作动画。为它们创建容器视图,然后只为容器视图设置动画。简单!
OR
2.不要依赖[查看子视图]才能正常工作。保留你自己想要移动的盒子阵列(一个ivar),然后迭代它。