[英]UIView animation iOS, Bizzarre
我可能正在做一些非常愚蠢的事情,但我不知道为什么这行不通。
我正在尝试执行简单的UIView块动画,但是遇到了麻烦。 我已经在测试项目中重新创建了。
我在View控制器上有一个视图,当我按下按钮时,我创建了一个新视图,并将其框架设置在当前视图之外(在其上方)。 我想为过渡设置动画,以使当前屏幕上的视图向下移动,因为上方的新视图向下取而代之。
这是连接到按钮的代码,原始视图连接为self.view1
- (IBAction)buttonPressed:(id)sender {
UIView *view2 = [[UIView alloc] init];
view2.backgroundColor = [UIColor blueColor];
float offScreenY = 0 - self.view1.frame.size.height;
CGRect offScreenRect = CGRectMake(0, offScreenY, self.view1.frame.size.width, self.view1.frame.size.height);
view2.frame = offScreenRect;
[self.view addSubview:view2];
float oldY = self.view1.frame.origin.y + self.view1.frame.size.height;
CGRect oldRect = CGRectMake(0, oldY, self.view1.frame.size.width, self.view1.frame.size.height);
[UIView animateWithDuration:0.5 animations:^{
self.view1.frame = oldRect;
view2.frame = CGRectMake(0, 0, self.view1.frame.size.width, self.view1.frame.size.height);
}];
}
这只会使view2向下动画,而不会为view 1设置动画。
如果我不将视图2添加为子视图,而仅将view1的帧更改放入动画块中,则view1会正确设置动画。
但是他们不会一起工作!
为什么是这样?
这是打开自动布局的经典症状。 如果为frame
设置动画,则它可以工作,但是自动布局会在视图上重新应用约束时, view1
将返回其原始位置。 通过添加view2
,iOS会立即自动重新应用自动布局约束,因此您的view1
将不会移动。
最重要的是,不要使用自动布局,而是尝试直接为frame
属性设置动画。 两种解决方案:
简单的解决方案是关闭自动版式。 转到IB,选择“文件检查器”,然后取消选中“使用自动版式”按钮:
如果要保持自动布局,则不应通过直接更改frame
属性来设置动画。 您可以通过更改布局约束常量来制作动画。 SO的其他地方已经回答了这一问题,但是如果您需要有关该方法的指导,请告诉我。
不过,基本思想是为您的view1
的顶级约束(称为view1TopConstraint
创建一个IBOutlet
,然后在动画块中可以说
self.view1TopConstraint.constant += self.view1.frame.size.height; [self.view layoutIfNeeded];
但是,要使此方法起作用,您必须注意对view1
的其他约束(例如,具有高度约束,没有底部约束,或者如果有,则降低其优先级,等等)。 初次这样做可能会很麻烦,但是通过更改约束很快就会摆脱动画的束缚。
但是,再说一次,如果您正在使用约束,则可能不应该通过view2
的frame
来定义view2
,但也可能为此定义了约束。
在这种情况下,最好具有容器视图。
相应地在该容器中添加view1和view2。 容器的某个部分将出现在屏幕中,并且容器的框架大小将是视图大小的两倍。 对容器进行动画处理,因此其他两个视图将相应地进行动画处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.