2016-12-25 4 views
3

電話機の向きが変更されたときに高さの制約を再計算します。私はこれを実現するために関数uninstall()install()を使用しています。しかし、それは望ましくは機能しません。私はそれらを間違って使用していますか?あなたが別の風景の中に高さと縦向きを持っているあなたのtableViewを持つようにしたい場合は方向変更のSnapKit制約を再計算

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

答えて

2

あなたは、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() 
    } 
} 
を入力する必要があります。
関連する問題