为了账号安全,请及时绑定邮箱和手机立即绑定

如何激活约束更改?

如何激活约束更改?

iOS
炎炎设计 2019-06-10 16:51:52
如何激活约束更改?我正在用AdBannerView当没有广告的时候,它就会从屏幕上滑落。当有一个广告,它在屏幕上幻灯片。基本的东西。旧的风格,我把框架设置在一个动画块。新款式,我有一个IBOutlet对于确定Y位置的自动布局约束,在这种情况下,它与SuperView底部的距离,并修改常量:- (void)moveBannerOffScreen {     [UIView animateWithDuration:5 animations:^{         _addBannerDistanceFromBottomConstraint.constant = -32;     }];     bannerIsVisible = FALSE;}- (void)moveBannerOnScreen {     [UIView animateWithDuration:5 animations:^{         _addBannerDistanceFromBottomConstraint.constant = 0;     }];     bannerIsVisible = TRUE;}横幅的移动和预期完全一样,但是不动画。最新情况:我重新看了WWDC 12谈掌握汽车布局的最佳实践包括动画。讨论如何使用共动画: 我尝试了以下代码,但得到了完全相同的结果:- (void)moveBannerOffScreen {     _addBannerDistanceFromBottomConstraint.constant = -32;     [UIView animateWithDuration:2 animations:^{         [self.view setNeedsLayout];     }];     bannerIsVisible = FALSE;}- (void)moveBannerOnScreen {     _addBannerDistanceFromBottomConstraint.constant = 0;     [UIView animateWithDuration:2 animations:^{         [self.view setNeedsLayout];     }];     bannerIsVisible = TRUE;}另外,我检查了很多次,这是在主线。
查看完整描述

3 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

两个重要的注意事项:

  1. 你需要打电话layoutIfNeeded在动画块中。实际上,Apple建议您在动画块之前调用它一次,以确保所有挂起的布局操作都已完成。

  2. 您需要在父视图(如:self.view),而不是附加约束的子视图。这样做将更新约束视图,包括动画其他可能被限制为您更改了视图A的约束的视图(例如,视图B附加到视图A的底部,而您刚刚更改了视图A的顶部偏移量,您希望视图B与它一起动画)

试试这个:

目标-C

- (void)moveBannerOffScreen {
    [self.view layoutIfNeeded];

    [UIView animateWithDuration:5
        animations:^{
            self._addBannerDistanceFromBottomConstraint.constant = -32;
            [self.view layoutIfNeeded]; // Called on parent view
        }];
    bannerIsVisible = FALSE;}- (void)moveBannerOnScreen { 
    [self.view layoutIfNeeded];

    [UIView animateWithDuration:5
        animations:^{
            self._addBannerDistanceFromBottomConstraint.constant = 0;
            [self.view layoutIfNeeded]; // Called on parent view
        }];
    bannerIsVisible = TRUE;}

SWIFT 3

UIView.animate(withDuration: 5) {
    self._addBannerDistanceFromBottomConstraint.constant = 0
    self.view.layoutIfNeeded()}


查看完整回答
反对 回复 2019-06-10
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

我很感谢你给出的答案,但我认为再深入一点会更好。

文档中的基本块动画

[containerView layoutIfNeeded]; // Ensures that all pending layout operations have been completed[UIView animateWithDuration:1.0 animations:^{
     // Make all constraint changes here
     [containerView layoutIfNeeded]; // Forces the layout of the subtree animation block and then captures all of the frame changes}];

但实际上,这是一个非常简单的场景。如果我想通过updateConstraints方法?

调用子视图updateConstraint方法的动画块

[self.view layoutIfNeeded];[self.subView setNeedsUpdateConstraints];[self.subView updateConstraintsIfNeeded];
[UIView animateWithDuration:1.0f delay:0.0f options:UIViewAnimationOptionLayoutSubviews animations:^{
    [self.view layoutIfNeeded];} completion:nil];

updateConstraint方法在UIView子类中被重写,必须在方法的末尾调用Super。

- (void)updateConstraints{
    // Update some constraints

    [super updateConstraints];}

AutoLayout指南还有很多有待改进的地方,但值得一读。我自己把这个作为一个UISwitch用一对UITextFields有一个简单而微妙的折叠动画(0.2秒长)。如上文所述,在UIView子类updateConstraint方法中处理子视图的约束。


查看完整回答
反对 回复 2019-06-10
  • 3 回答
  • 0 关注
  • 608 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信