iOS:自动布局:动画后锁定新位置

Posted

技术标签:

【中文标题】iOS:自动布局:动画后锁定新位置【英文标题】:iOS: Autolayout: Lock new position after animating 【发布时间】:2013-12-07 22:45:24 【问题描述】:

我尝试为 UIView 编写一个类别函数,该函数将获得将给定框架保持在其父视图中的适当位置的约束。我是这样实现的:

    -(NSArray *)constraintsForLockingPositionInSuperview
    
        NSLayoutConstraint *left=[NSLayoutConstraint constraintWithItem:self 
    attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.superview 
    attribute:NSLayoutAttributeLeft multiplier:0 constant:self.frame.origin.x];

        NSLayoutConstraint *height=[NSLayoutConstraint constraintWithItem:self 
    attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:Nil 
    attribute:NSLayoutAttributeNotAnAttribute multiplier:0 constant:self.frame.size.height];

        NSLayoutConstraint *width=[NSLayoutConstraint constraintWithItem:self 
    attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:Nil 
    attribute:NSLayoutAttributeNotAnAttribute multiplier:0 constant:self.frame.size.width];

        NSLayoutConstraint *top=[NSLayoutConstraint constraintWithItem:self 
    attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.superview 
    attribute:NSLayoutAttributeTop multiplier:0 constant:self.frame.origin.y];

        return @[left,height,width,top  ];

    

然后在动画视图之后,通过在包含相关视图的视图控制器中执行以下操作来应用新约束。我删除视图,然后重新添加它以删除其上的约束,然后重新应用新约束。希望如果我添加另一个子视图或者像 actionView 这样的东西进入并且视图必须自行布局,这将使视图保持在适当的位置。高度和宽度似乎正确锁定,但视图跳到中间而不是锁定到位:

NSArray *lockingConstraints = [someView constraintsForLockingPositionInSuperview];
        [someView removeFromSuperview];
        [self.view addSubview:someView;
        [self.view addConstraints:lockingConstraints];
        [self.view layoutSubviews];

【问题讨论】:

【参考方案1】:

来自layoutSubviews 的文档:

你不应该直接调用这个方法。

请致电layoutIfNeeded。

【讨论】:

感谢您的指点。绝对不会再直接调用它了。但是,不幸的是,layoutIfNeeded 也不起作用。 没关系,它成功了!我忘记了我在动画中的锚点发生了变化。当我摆脱那句话时,它起作用了!知道为什么会这样吗?

以上是关于iOS:自动布局:动画后锁定新位置的主要内容,如果未能解决你的问题,请参考以下文章

在使用自动布局下动画/移动视图

自动布局中断 UIView 动画

使用NSView.layoutSubtreeIfNeeded()动画自动布局约束不适用于macOS High Sierra

如何使用按钮动画实现自动布局

动画后自动布局约束不起作用[重复]

使用自动布局时 UIImageView 没有动画