在方向改变时重新计算 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 约束的主要内容,如果未能解决你的问题,请参考以下文章