使用约束动画UIView的框架

5

我在UIView中有一个元素,其约束条件指定它应始终与视图底部相距10像素。然后,我尝试动画化此视图的高度,以便它看起来向下滑动屏幕。根据约束条件,该元素应始终距视图底部10像素。当我像这样添加视图时,这仍然是正确的...

printView *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"printView"];
    [self addChildViewController:vc];
    vc.view.frame = CGRectMake(0, 60, vc.view.frame.size.width, HEIGHT);
    vc.view.layer.masksToBounds = FALSE;
    [vc.view.layer setShadowOffset:CGSizeMake(0.0, 5.0)];
    [vc.view.layer setShadowOpacity:0.8];
    vc.view.layer.shadowColor = [[UIColor blackColor] CGColor];
    vc.view.layer.shadowRadius = 8;
    vc.view.clipsToBounds = TRUE;
    [self.view insertSubview:vc.view aboveSubview:docWebView];

我可以将HEIGHT更改为任何我想要的高度,并且该元素始终与视图底部相距10像素。问题出现在我尝试动画化高度时。

printView *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"printView"];
    [self addChildViewController:vc];
    vc.view.frame = CGRectMake(0, 60, vc.view.frame.size.width, 0);
    vc.view.layer.masksToBounds = FALSE;
    [vc.view.layer setShadowOffset:CGSizeMake(0.0, 5.0)];
    [vc.view.layer setShadowOpacity:0.8];
    vc.view.layer.shadowColor = [[UIColor blackColor] CGColor];
    vc.view.layer.shadowRadius = 8;
    vc.view.clipsToBounds = TRUE;
    [self.view insertSubview:vc.view aboveSubview:docWebView];
    [UIView animateWithDuration:5.0 animations:^{
        vc.view.frame = CGRectMake(0, 60, vc.view.frame.size.width, 200);
        [self.view setNeedsDisplay];
    }];

约束条件不再受到尊重,而是视图与元素始终相距10像素的滑入效果已不存在,因为元素不随视图移动。希望我能够解释清楚。换句话说,我想实现地图被拉下的效果,但实际上看起来像地图已经在那里,只是一张覆盖在上面的纸被拿走了。感谢您的帮助。

1个回答

14

在使用约束时,不应该设置框架,而是要调整约束。在最初设置约束时,应该将IBOutlet设置为高度约束,然后在动画块中对其常数参数进行动画处理。如果你有一个名为heightCon的高度约束,你可以这样做:

[UIView animateWithDuration:5.0 animations:^{
        self.heightCon.constant = 200
        [self.view layoutIfNeeded];
    }];

我不确定你的结构是否正确,可能要把self.view改为vc.view。

修改后:

这是动画高度约束的方法,但我不确定这是否是您想要实现所需的外观。 我真的不确定您最后一段话的意思。 如果您想获得地图被拉下的效果,似乎底部约束需要进行动画处理或消除。


1
哦,天啊。我不知道可以为约束创建一个插座。太神奇了! - fnc12
如果你有4个标签,从上到下,如何使用autolayout来定位这些标签。我的意思是你有3种类型的约束条件:第一个标签和视图顶部,两个标签之间,最后一个标签和视图底部。我应该如何指定这些约束条件,以便不会过度拉伸它们之间的空间,也不会拉伸标签本身的高度?我应该给出基于百分比的空间/距离/高度还是固定的量(对于iPhone5、6、Plus、iPad mini、iPad Air、iPad Pro是不同的)。我只想要一个大致的想法,不需要代码。 - mfaani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接