0

我想根据大小类构建一个具有两种不同布局的简单 Swift 3 iOS 10 应用程序。当我viewControllertraitCollection.verticalSizeClass类型为 时.regular,我希望我的blueView(的子类 UIViewtableView.tableHeaderView的高度为50。当我viewControllertraitCollection.verticalSizeClass类型为 时.compact,我希望我blueView在左边(自动布局宽度约束为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 repo上找到。


启动时一切正常:blueView设置为tableView.tableHeaderView并且具有正确的高度50。如果我旋转我的设备,一切仍然正常:blueView并且tableView有正确的约束。

但是,如果我第二次旋转设备,blueView就会从控制器的视图中消失,并且tableView显示一个空的tableHeaderView. 我能做些什么来解决这个问题?

4

1 回答 1

0

错误的自动布局约束是我的问题的原因。我设法通过删除blueView'并在每次旋转时constraints切换blueView'属性来解决它。translatesAutoresizingMaskIntoConstraints

尽管我怀疑这是解决此问题的最佳方法,但以下代码可以正常工作并且不会生成自动布局约束错误日志。

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
        }
    }

}
于 2017-02-13T20:35:52.710 回答