在方向改变时重新计算 SnapKit 约束

Posted

技术标签:

【中文标题】在方向改变时重新计算 SnapKit 约束【英文标题】:Recalculate SnapKit Constraint on orientation change 【发布时间】:2016-12-25 14:16:35 【问题描述】:

我想在手机方向改变时重新计算高度限制。我正在使用函数uninstall()install() 来实现这一点。但是,它没有按预期工作。我是不是用错了?

class ActionOverlayViewController: UIViewController 
    private var tableView = UITableView()
    private var heightConstraint: Constraint?

    override func viewDidLoad() 
        super.viewDidLoad()

        tableView.snp_makeConstraints  make in
            self.heightConstraint = make.height.lessThanOrEqualTo(UIScreen.mainScreen().bounds.size.height).priorityHigh().constraint
            make.height.equalTo(242).priorityLow()
        
    

    override func updateViewConstraints() 
        tableView.snp_updateConstraints  make in
            self.heightConstraint.uninstall()
            self.heightConstraint.install()
        
        super.updateViewConstraints()
    

    override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) 
        super.traitCollectionDidChange(previousTraitCollection)
        updateViewConstraints()
    

【问题讨论】:

【参考方案1】:

如果您想让 tableView 在横向和纵向方向具有不同的高度,您可以使用 2 种不同的方法:

1.横向高度应为 200,纵向高度应为 400:

class ViewController: UIViewController 

    let tableView = UITableView()
    var heightConstraint: Constraint?

    override func viewDidLoad() 
        super.viewDidLoad()

        view.addSubview(tableView)

        tableView.snp.makeConstraints  (make) in
            make.top.left.right.equalTo(0)
            self.heightConstraint = make.height.equalTo(0).constraint
        
    

    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) 
        super.traitCollectionDidChange(previousTraitCollection)
        let height = UIDevice.current.orientation.isLandscape ? 200 : 400
        heightConstraint?.update(offset: height)
    

在这里你只需要在约束上调用update(offset:)。无需通过updateViewConstraints()。如果您有静态高度,这很有效。

2。高度应为纵向屏幕高度的一半,横向为全屏:

在这里您必须更新整个约束,因为您不使用静态高度。因此,您不需要保留对约束的引用,但您必须通过updateViewConstraint()

class ViewController: UIViewController 

    let tableView = UITableView()

    override func viewDidLoad() 
        super.viewDidLoad()

        view.addSubview(tableView)
    

    override func updateViewConstraints() 
        super.updateViewConstraints()
        tableView.snp.remakeConstraints  (make) in
            make.top.left.right.equalTo(0)
            if UIDevice.current.orientation.isLandscape 
                make.bottom.equalTo(0)
             else 
                make.bottom.equalTo(view.snp.centerY)
            
        
    

    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) 
        super.traitCollectionDidChange(previousTraitCollection)
        view.setNeedsUpdateConstraints()
    

【讨论】:

以上是关于在方向改变时重新计算 SnapKit 约束的主要内容,如果未能解决你的问题,请参考以下文章

如何添加约束以使视图的尺寸在方向改变时不会改变?

自动布局 [Snapkit] 更改旋转约束

当方向改变时重新定位控件

改变方向时UILabel没有调整

界面方向改变时调整图层大小?

当方向改变时,视图中何时重新加载资源?