第二次旋转后 tableView.tableHeaderView 中的视图框架错误
Wrong frame for view in tableView.tableHeaderView after a second rotation
我想构建一个简单的 Swift 3 iOS 10 应用程序,根据大小 类 有两种不同的布局。当我的 viewController
有一个类型为 .regular
的 traitCollection.verticalSizeClass
时,我希望我的 blueView
(UIView
的一个子类)成为 tableView.tableHeaderView
50
的身高。当我的 viewController
有一个类型为 .compact
的 traitCollection.verticalSizeClass
时,我希望我的 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
。我该怎么做才能解决这个问题?
我的问题是错误的自动布局约束造成的。我设法通过删除 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({ [=10=].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({ [=10=].isActive = false }) also works
blueView.translatesAutoresizingMaskIntoConstraints = false
self.tableView.tableHeaderView = nil
}
}
}
我想构建一个简单的 Swift 3 iOS 10 应用程序,根据大小 类 有两种不同的布局。当我的 viewController
有一个类型为 .regular
的 traitCollection.verticalSizeClass
时,我希望我的 blueView
(UIView
的一个子类)成为 tableView.tableHeaderView
50
的身高。当我的 viewController
有一个类型为 .compact
的 traitCollection.verticalSizeClass
时,我希望我的 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
。我该怎么做才能解决这个问题?
我的问题是错误的自动布局约束造成的。我设法通过删除 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({ [=10=].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({ [=10=].isActive = false }) also works
blueView.translatesAutoresizingMaskIntoConstraints = false
self.tableView.tableHeaderView = nil
}
}
}