2017-02-13 20 views
0

Я хочу создать простое приложение Swift 3 iOS 10 с двумя разными макетами в соответствии с классами размера. Когда у моего viewController есть traitCollection.verticalSizeClass типа .regular, я хочу, чтобы мой blueView (подкласс UIView) был tableView.tableHeaderView с высотой 50. Когда у моего viewController есть traitCollection.verticalSizeClass типа .compact, я хочу, чтобы мой blueView был слева (с ограничением ширины автоматического макета 240), а мой tableView - справа.Неверный кадр для просмотра в таблицеView.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. Если я вращаю свое устройство, все по-прежнему работает нормально: blueView и tableView имеют правильные ограничения.

Однако, если я поворачиваю устройство во второй раз, blueView исчезают из-под контроля, а tableView отображает пустой tableHeaderView. Что я могу сделать для решения этой проблемы?

ответ

0

Неверные ограничения автоматического макета отвечали за мою проблему. Мне удалось решить эту проблему, удалив blueView's constraints и переключив 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 
     } 
    } 

}