Неправильный кадр для представления в tableView.tableHeaderView после второго поворота
Я хочу создать простое приложение Swift 3 для iOS 10 с двумя различными макетами в соответствии с размерами классов. Когда мой viewController
имеет traitCollection.verticalSizeClass
типа .regular
, Я хочу мое blueView
(подкласс UIView
) быть tableView.tableHeaderView
с высоты 50
, Когда мой viewController
имеет traitCollection.verticalSizeClass
типа .compact
, Я хочу мое blueView
находиться слева (с ограничением ширины Auto layout 240
) и мой tableView
быть справа.
Это код моего 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
}
}
}
Следующий снимок экрана показывает раскадровку со сценами, установленными в портретном режиме:
На следующем снимке экрана показана раскадровка со сценами, установленными в ландшафтном режиме:
Полный проект можно найти на этом репозитории Github.
Все отлично работает при запуске: blueView
устанавливается как tableView.tableHeaderView
и имеет правильную высоту 50
, Если я поверну свое устройство, все будет работать нормально: blueView
и tableView
иметь правильные ограничения.
Однако, если я поверну устройство во второй раз, blueView
исчезают из поля зрения контроллера и tableView
отображает пустой tableHeaderView
, Что я могу сделать, чтобы решить эту проблему?
1 ответ
Неправильные ограничения Auto Layout были причиной моей проблемы. Мне удалось решить это, удалив blueView
"s constraints
и переключая blueView
"s translatesAutoresizingMaskIntoConstraints
свойство при каждом обороте.
Хотя я сомневаюсь, что это лучший способ решить эту проблему, следующий код работает и не генерирует журналы ошибок ограничений Auto Layout.
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
}
}
}