5

電話の向きが変わったときに高さの制約を再計算したい。私は関数を使用しており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()
    }
}
4

1 に答える 1

3

横向きと縦向きで異なる高さを持たせたい場合は、tableView2 つの異なるアプローチを使用できます。

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()
    }
}
于 2017-02-26T16:33:51.830 に答える