Неправильный кадр для представления в 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
        }
    }

}
Другие вопросы по тегам