0

我有名为 self.myMainView 的超级视图

在那个视图中,我有三个子视图: UIView *view1(绿色视图)、UIView *view2(灰色视图)、UIImageView *view3

我想动画视图3的移动

当视图 3 完成此动画时,我想更改视图层次结构,例如示例屏幕截图。

这是示例图像:

前:

在我们的操纵之后,它必须是

4

3 回答 3

2

您正在做的是更改视图分层顺序的正常标准方法。所以问题不在于这个,而用你的话来说“但是,它违反了我的动画”和“粉碎我的动画”。那么,问题在于你的动画,如果它可以通过重新排列图层来“违反”和“粉碎”。但是,在您的问题中,您没有提供有关动画的任何信息!然而,这显然是问题的核心。

编辑:既然你已经发布了动画代码,我就可以测试了,我明白了问题所在。问题是您正在使用自动布局。

view3由约束定位。当您为 的位置设置动画时view3,您违反了这些约束,但这不会立即变得明显。但是当你交换 和 的分层顺序时view1view2就会进行布局!view3然后强制执行对 的约束。由于这些约束并没有改变,我们会看到view3你最初拥有它的地方。

最简单的解决方案是在不需要时关闭自动布局。否则,您将不得不在动画之后或作为动画的一部分更改约束。事实上,您可以view3通过为其位置约束设置动画来重新定位。我在我的书中描述了这一切,在这里:http ://www.aeth.com/iOSBook/ch17.html#_animation_and_autolayout

于 2013-04-24T18:20:13.443 回答
0

如果你想要做的只是切换你的 2 个子视图中的哪一个在另一个之上,你可以简单地使用[UIView bringSubviewToFront:]而不是直接弄乱你的子视图数组的顺序吗?这可能会解决动画问题。我会尝试的另一件事是if( finished )围绕您的电话进行exchangeSubviewAtIndex,以确保它不会干扰其他动画视图。

于 2013-04-24T18:38:27.747 回答
0

问题出在视图 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,我们不设置框架或中心视图属性。好的,我们完成了,这就像我想要的那样工作。希望这对你也有帮助。

于 2013-04-25T20:17:09.463 回答