如何激活约束更改?

如何激活约束更改?

我正在用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;}

另外,我检查了很多次,这是在线。


炎炎设计
浏览 617回答 3
3回答

跃然一笑

两个重要的注意事项:你需要打电话layoutIfNeeded在动画块中。实际上,Apple建议您在动画块之前调用它一次,以确保所有挂起的布局操作都已完成。您需要在父视图(如: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 3UIView.animate(withDuration: 5) {     self._addBannerDistanceFromBottomConstraint.constant = 0     self.view.layoutIfNeeded()}

慕哥9229398

我很感谢你给出的答案,但我认为再深入一点会更好。文档中的基本块动画[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方法中处理子视图的约束。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS