2017-02-13 31 views
0

我想根據大小等級使用兩種不同的佈局構建一個簡單的Swift 3 iOS 10應用程序。當我的viewController的類型爲.regular時,我想讓我的blueViewUIView的一個子類)爲tableView.tableHeaderView,高度爲50。當我的viewControllertraitCollection.verticalSizeClass類型爲.compact時,我希望我的blueView位於左側(自動佈局寬度限制爲240),而我的tableView位於右側。在第二次輪換後在tableView.tableHeaderView中查看錯誤的框架


這是我UIViewController實例代碼:

import UIKit 

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    @IBOutlet weak var tableView: UITableView! { 
     didSet { 
      tableView.dataSource = self 
      tableView.delegate = self 
     } 
    } 
    @IBOutlet weak var blueView: UIView! 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 1 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     return tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 
    } 

    override func viewWillLayoutSubviews() { 
     super.viewWillLayoutSubviews() 

     if self.traitCollection.verticalSizeClass == .regular { 
      blueView.bounds = CGRect(x: tableView.frame.origin.x, y: tableView.frame.origin.y, width: tableView.bounds.width, height: 50) 
      tableView.tableHeaderView = blueView 
     } else { 
      self.tableView.tableHeaderView = nil 
     } 
    } 

} 

下面的截圖顯示,在人像模式中設置場景的故事板:

enter image description here

下面的屏幕截圖顯示了以場景模式設置場景的故事板:

enter image description here

完整的項目可以在這Github repo找到。


一切正常上發佈:blueView設置爲tableView.tableHeaderView並具有50正確的高度。如果我旋轉我的設備,一切仍然正常工作:blueViewtableView有正確的約束。

但是,如果我第二次旋轉設備,blueView會從控制器視圖中消失,而tableView會顯示空的tableHeaderView。我能做些什麼來解決這個問題?

回答

0

錯誤的自動佈局約束是我的問題的責任。我已經設法解決它,通過刪除blueViewconstraints和切換blueViewtranslatesAutoresizingMaskIntoConstraints屬性在每次旋轉。

儘管我懷疑這是解決此問題的最佳方法,但下面的代碼工作並不會生成自動佈局約束錯誤日誌。

import UIKit 

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    @IBOutlet weak var tableView: UITableView! { 
     didSet { 
      tableView.dataSource = self 
      tableView.delegate = self 
     } 
    } 
    @IBOutlet weak var blueView: UIView! 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 1 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     return tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 
    } 

    override func viewWillLayoutSubviews() { 
     super.viewWillLayoutSubviews() 

     if self.traitCollection.verticalSizeClass == .regular { 
      blueView.removeConstraints(blueView.constraints) 
      //blueView.constraints.forEach({ $0.isActive = false }) also works 
      blueView.translatesAutoresizingMaskIntoConstraints = true 
      blueView.bounds = CGRect(x: tableView.frame.origin.x, y: tableView.frame.origin.y, width: tableView.bounds.width, height: 50) 
      tableView.tableHeaderView = blueView 
     } else { 
      blueView.removeConstraints(blueView.constraints) 
      //blueView.constraints.forEach({ $0.isActive = false }) also works 
      blueView.translatesAutoresizingMaskIntoConstraints = false 
      self.tableView.tableHeaderView = nil 
     } 
    } 

} 
相關問題