我有名为 self.myMainView 的超级视图
在那个视图中,我有三个子视图: UIView *view1(绿色视图)、UIView *view2(灰色视图)、UIImageView *view3
我想动画视图3的移动
当视图 3 完成此动画时,我想更改视图层次结构,例如示例屏幕截图。
这是示例图像:
您正在做的是更改视图分层顺序的正常标准方法。所以问题不在于这个,而用你的话来说“但是,它违反了我的动画”和“粉碎我的动画”。那么,问题在于你的动画,如果它可以通过重新排列图层来“违反”和“粉碎”。但是,在您的问题中,您没有提供有关动画的任何信息!然而,这显然是问题的核心。
编辑:既然你已经发布了动画代码,我就可以测试了,我明白了问题所在。问题是您正在使用自动布局。
view3
由约束定位。当您为 的位置设置动画时view3
,您违反了这些约束,但这不会立即变得明显。但是当你交换 和 的分层顺序时view1
,view2
就会进行布局!view3
然后强制执行对 的约束。由于这些约束并没有改变,我们会看到view3
你最初拥有它的地方。
最简单的解决方案是在不需要时关闭自动布局。否则,您将不得不在动画之后或作为动画的一部分更改约束。事实上,您可以view3
通过为其位置约束设置动画来重新定位。我在我的书中描述了这一切,在这里:http ://www.aeth.com/iOSBook/ch17.html#_animation_and_autolayout
如果你想要做的只是切换你的 2 个子视图中的哪一个在另一个之上,你可以简单地使用[UIView bringSubviewToFront:]
而不是直接弄乱你的子视图数组的顺序吗?这可能会解决动画问题。我会尝试的另一件事是if( finished )
围绕您的电话进行exchangeSubviewAtIndex
,以确保它不会干扰其他动画视图。
问题出在视图 3 的约束中,它在动画后不会改变,当我们想要操纵视图层次结构时,动画会停止正常工作。马特在他的回答中谈到了这一点,他还从他的好书中提供了一个解决方案:http ://www.aeth.com/iOSBook/ch17.html#_animation_and_autolayout 谢谢你的马特。
我稍微更改了此解决方案,并决定将其发布在此处以供需要此解决方案的任何人使用。但如果你想更好地理解这一点,我强烈建议你阅读书中关于动画的章节,链接在上面。
首先,我们需要为视图 3 的移动设置动画,然后更改我们的约束,并且只有在此之后才更改视图层次结构。在书中找到了几种方法来做到这一点,但在我看来,这是最好的:
layout = -35.0; // new constraint constant of self.view3
NSArray *constraintsForAnimation = self.myMainView.constraints; // all constraints of superview
NSUInteger indexOfconstraintsAttribute = [constraintsForAnimation
indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop){ // get index of constraint of view 3
NSLayoutConstraint *constraint = obj;
return (([constraint.firstItem isEqual: self.view3])) ? idx : NO; // return this index if we found constraint of view 3
}];
constraint.constant = layout; // changing the constraint of view3
[UIView animateWithDuration:0.3 animations:^{ // animation
[self.view3 layoutIfNeeded]; // apply new constraints to view3
}];
[self.myMainView exchangeSubviewAtIndex:3 withSubviewAtIndex:4];// toggle view 1 with view 2
我们仅在约束的帮助下移动视图 3,我们不设置框架或中心视图属性。好的,我们完成了,这就像我想要的那样工作。希望这对你也有帮助。