在 Swift 运行时更改自动布局约束的 UIView 的框架

Posted

技术标签:

【中文标题】在 Swift 运行时更改自动布局约束的 UIView 的框架【英文标题】:Changing an Autolayout-constrained UIView's frame at runtime in Swift 【发布时间】:2016-08-28 16:32:09 【问题描述】:

例如,我使用此代码更改名为 PropoUIView 的框架位置:

        self.Propo.frame.origin.x -= self.view.frame.width

Propo 在情节提要中有限制)

但是当应用程序视图消失并重新出现时,UIView 会将自身重置为其原始位置。我该怎么做才能解决它?我希望 UIView 在我以编程方式更改它时保持其位置。

我已经尝试过 updateViewConstraints() 附加任何其他内容...

【问题讨论】:

如果视图有约束,永远不要改变框架! 【参考方案1】:

约束和手动框架操作直接冲突。你必须选择其中之一。相反,您应该通过 Ctrl 将其作为 Storyboard 中的 @IBOutlet 拖动到您的视图控制器来“提升”您希望更改的约束。然后,您可以操作它的常量:

class MyViewController: UIViewController 
    @IBOutlet weak var myPropoLeftEdgeConstraint: NSLayoutConstraint!

    @IBAction doChangePropo(sender: AnyObject) 
        myPropoLeftEdgeConstraint.constant -= view.frame.width
        view.layoutIfNeeded()
    

这已经在 Objective C 中的许多地方进行了介绍,因此,如果您可以阅读这些示例,只需搜索以编程方式更改代码中的 NSLayoutConstraint。

How to edit constraint in code

(进行编辑以使其更适用:通常应该对约束进行动画处理以获得干净的用户体验。否则眼睛会感到困惑。)

您可以通过将view.layoutIfneeded 包装在UIView.animateWithDuration(duration) ... 块中来轻松地为约束调整设置动画。

【讨论】:

谢谢 BaseZen!

以上是关于在 Swift 运行时更改自动布局约束的 UIView 的框架的主要内容,如果未能解决你的问题,请参考以下文章

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何设置自动布局约束常量通用或设备特定?

Swift UIView 自动布局和约束

隐藏视图时,自动布局中的 Swift 约束不会改变

在 Swift 中,当方向发生时如何更改表格单元格布局?

Android XML:设备更改时布局行更改