UItableView automaticDimension 不适用于 UIStackView
UItableView automaticDimension not working with UIStackView
我希望我的 UITableViewCell
正确计算其高度,使其底部与 UIStackView
底部匹配。
我了解到,要使 UITableView.automaticDimension
正常工作,您需要设置 UITableViewCell
的所有垂直约束,以便它可以计算其高度。
这就是我做不到的。我做了一个测试项目,我确定:
tableView.rowHeight
属性 设置为 UITableView.automaticDimension
.
- 不执行功能
heightForRowAt
。
TableViewCell
Row Height
在xib文件中设置为Automatic
。
- 所有视图都在垂直方向上受到限制。
- 一起玩
UIStackView
distribution
属性.
- 要将
UIStackView
底部约束设置为 superView
至 Less Than or Equal
(此项目太小且 Greater Than or Equal
,或 Equal
,项目的高度等于屏幕宽度,因为它们有 aspect ratio
1:1
- 与
Content Hugging Priority
和 Content Compression Resistance Priority
一起玩。测试中所有视图都有默认值,拥抱水平和垂直250,压缩水平和垂直750。
代码:
import Foundation
import UIKit
class IBAutomaticDimensionTableViewViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet private weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.rowHeight = UITableView.automaticDimension
tableView.register(
IBAutomaticDimensionTableViewCell.nib,
forCellReuseIdentifier: IBAutomaticDimensionTableViewCell.nibName
)
tableView.delegate = self
tableView.dataSource = self
tableView.reloadData()
// view.layoutIfNeeded() Not working with or without it
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 5
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(
withIdentifier: IBAutomaticDimensionTableViewCell.nibName,
for: indexPath
) as! IBAutomaticDimensionTableViewCell
return cell
}
}
单元格的 xib 文件:
具有 Less Than or Equal
底部约束的结果:
具有 Greater Than or Equal
或 Equal
底部约束的结果:
问题是宽高比限制。似乎他们优先考虑宽度而不是高度(这对我来说很奇怪,因为高度是一个常数值,我希望它优先于计算值,但 Apple 的想法不同)
在Android中你可以指定哪一个有偏好(宽度或高度),我不知道这里有什么办法(玩纵横比约束的关系没有解决它)
替换硬编码宽度值的纵横比约束(第一个视图 32 个,其余视图 20 个)解决了问题
我希望我的 UITableViewCell
正确计算其高度,使其底部与 UIStackView
底部匹配。
我了解到,要使 UITableView.automaticDimension
正常工作,您需要设置 UITableViewCell
的所有垂直约束,以便它可以计算其高度。
这就是我做不到的。我做了一个测试项目,我确定:
tableView.rowHeight
属性 设置为UITableView.automaticDimension
.- 不执行功能
heightForRowAt
。 TableViewCell
Row Height
在xib文件中设置为Automatic
。- 所有视图都在垂直方向上受到限制。
- 一起玩
UIStackView
distribution
属性. - 要将
UIStackView
底部约束设置为superView
至Less Than or Equal
(此项目太小且Greater Than or Equal
,或Equal
,项目的高度等于屏幕宽度,因为它们有aspect ratio
1:1 - 与
Content Hugging Priority
和Content Compression Resistance Priority
一起玩。测试中所有视图都有默认值,拥抱水平和垂直250,压缩水平和垂直750。
代码:
import Foundation
import UIKit
class IBAutomaticDimensionTableViewViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet private weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.rowHeight = UITableView.automaticDimension
tableView.register(
IBAutomaticDimensionTableViewCell.nib,
forCellReuseIdentifier: IBAutomaticDimensionTableViewCell.nibName
)
tableView.delegate = self
tableView.dataSource = self
tableView.reloadData()
// view.layoutIfNeeded() Not working with or without it
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 5
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(
withIdentifier: IBAutomaticDimensionTableViewCell.nibName,
for: indexPath
) as! IBAutomaticDimensionTableViewCell
return cell
}
}
单元格的 xib 文件:
具有 Less Than or Equal
底部约束的结果:
具有 Greater Than or Equal
或 Equal
底部约束的结果:
问题是宽高比限制。似乎他们优先考虑宽度而不是高度(这对我来说很奇怪,因为高度是一个常数值,我希望它优先于计算值,但 Apple 的想法不同)
在Android中你可以指定哪一个有偏好(宽度或高度),我不知道这里有什么办法(玩纵横比约束的关系没有解决它)
替换硬编码宽度值的纵横比约束(第一个视图 32 个,其余视图 20 个)解决了问题