繁体   English   中英

UIView动画iOS,Bizzarre

[英]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属性设置动画。 两种解决方案:

  1. 简单的解决方案是关闭自动版式。 转到IB,选择“文件检查器”,然后取消选中“使用自动版式”按钮:

    在此处输入图片说明

  2. 如果要保持自动布局,则不应通过直接更改frame属性来设置动画。 您可以通过更改布局约束常量来制作动画。 SO的其他地方已经回答了这一问题,但是如果您需要有关该方法的指导,请告诉我。

    不过,基本思想是为您的view1的顶级约束(称为view1TopConstraint创建一个IBOutlet ,然后在动画块中可以说

     self.view1TopConstraint.constant += self.view1.frame.size.height; [self.view layoutIfNeeded]; 

    但是,要使此方法起作用,您必须注意对view1的其他约束(例如,具有高度约束,没有底部约束,或者如果有,则降低其优先级,等等)。 初次这样做可能会很麻烦,但是通过更改约束很快就会摆脱动画的束缚。

    但是,再说一次,如果您正在使用约束,则可能不应该通过view2frame来定义view2 ,但也可能为此定义了约束。

在这种情况下,最好具有容器视图。

相应地在该容器中添加view1和view2。 容器的某个部分将出现在屏幕中,并且容器的框架大小将是视图大小的两倍。 对容器进行动画处理,因此其他两个视图将相应地进行动画处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM