2016-12-25 5 views
3

전화 방향이 변경 될 때 높이 제한을 다시 계산하고 싶습니다. 이 문제를 해결하기 위해 uninstall()install() 함수를 사용하고 있습니다. 그러나 원하는대로 작동하지 않습니다. 내가 잘못 사용하고 있습니까?방향 변경시 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 개 개의 다른 접근 사용할 수있는 세로 방향이 당신의 tableView를 원한다면 : 세로에서 가로 200 및 400을해야

1. 높이 :

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() 
    } 
} 
을 통과해야합니다.