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

时间:2016-12-25 14:16:36

标签: snapkit

我想在手机方向改变时重新计算高度限制。我正在使用函数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 个答案:

答案 0 :(得分:3)

如果您希望tableView在横向和纵向方向上具有不同的高度,您可以使用两种不同的方法:

<强> 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()
    }
}