iOS 中的自调整(动态高度)单元格 8 - 没有自定义 UITableViewCell 可能吗?
Self-Sizing (Dynamic Height) Cells in iOS 8 - Possible without Custom UITableViewCell?
是否可以在不创建自定义 UITableViewCell 的情况下在 iOS 8 中自行调整 UITableViewCell 的大小?
我认为标准的 UITableViewCell 类型(UITableViewCellStyleDefault、UITableViewCellStyleSubtitle、UITableViewCellStyleValue1、UITableViewCellStyleValue2)内置了自动布局约束。非自定义单元格的约束无法在 Storyboard 中更改这一事实证实了这一点。
但是当我使用类型为 UITableViewCellStyleValue1 的非自定义单元格时,在 Storyboard 中进行设置,将 textLabel 和 detailTextLabel 的 numberOfRows 设置为 0,并如下设置 viewDidLoad 代码时,仅考虑单元格的 textLabel在单元格高度的自动调整中。如果 detailTextLabel 最终显示的行多于 textLabel,则 detailTextLabel 的文本会溢出单元格的顶部和底部边缘。同样,单元格确实会针对 textLabel 正确调整大小,但似乎在调整大小的过程中忽略了 detailTextLabel。
我需要知道的主要事情是 - 如果我想正确支持动态文本和自调整大小,我是否需要为可以使用标准单元格的行创建自定义单元格?
- (void)viewDidLoad {
[super viewDidLoad];
[self.tableView setEstimatedRowHeight:DEFAULT_ROW_HEIGHT];
[self.tableView setRowHeight:UITableViewAutomaticDimension];
}
我刚刚在 iOS 10/XCode 8 中尝试了这个(在 iOS 9/XCode 7 中结果相同)使用不同的细胞类型,它看起来像仅适用于 textLabel 而不适用于 detailTextLabel。
(基本上重复OP提到的问题)
ViewController 在 detailTextLabel 和 textLabel 上交替设置一些文本的代码。
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.estimatedRowHeight = 44
tableView.rowHeight = UITableViewAutomaticDimension
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
if indexPath.row % 2 == 0 {
cell.textLabel?.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
cell.detailTextLabel?.text = "<- textLabel"
} else {
cell.textLabel?.text = "detailTextLabel ->"
cell.detailTextLabel?.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
}
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10
}
}
确保将 textLabel 和 textDetailLabel 的行 属性 设置为 0,这是结果。
基本单元格
右侧详细信息单元格
左侧详细信息单元格
字幕单元格
我会将其报告为错误。
是否可以在不创建自定义 UITableViewCell 的情况下在 iOS 8 中自行调整 UITableViewCell 的大小?
我认为标准的 UITableViewCell 类型(UITableViewCellStyleDefault、UITableViewCellStyleSubtitle、UITableViewCellStyleValue1、UITableViewCellStyleValue2)内置了自动布局约束。非自定义单元格的约束无法在 Storyboard 中更改这一事实证实了这一点。
但是当我使用类型为 UITableViewCellStyleValue1 的非自定义单元格时,在 Storyboard 中进行设置,将 textLabel 和 detailTextLabel 的 numberOfRows 设置为 0,并如下设置 viewDidLoad 代码时,仅考虑单元格的 textLabel在单元格高度的自动调整中。如果 detailTextLabel 最终显示的行多于 textLabel,则 detailTextLabel 的文本会溢出单元格的顶部和底部边缘。同样,单元格确实会针对 textLabel 正确调整大小,但似乎在调整大小的过程中忽略了 detailTextLabel。
我需要知道的主要事情是 - 如果我想正确支持动态文本和自调整大小,我是否需要为可以使用标准单元格的行创建自定义单元格?
- (void)viewDidLoad {
[super viewDidLoad];
[self.tableView setEstimatedRowHeight:DEFAULT_ROW_HEIGHT];
[self.tableView setRowHeight:UITableViewAutomaticDimension];
}
我刚刚在 iOS 10/XCode 8 中尝试了这个(在 iOS 9/XCode 7 中结果相同)使用不同的细胞类型,它看起来像仅适用于 textLabel 而不适用于 detailTextLabel。
(基本上重复OP提到的问题)
ViewController 在 detailTextLabel 和 textLabel 上交替设置一些文本的代码。
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.estimatedRowHeight = 44
tableView.rowHeight = UITableViewAutomaticDimension
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
if indexPath.row % 2 == 0 {
cell.textLabel?.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
cell.detailTextLabel?.text = "<- textLabel"
} else {
cell.textLabel?.text = "detailTextLabel ->"
cell.detailTextLabel?.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
}
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10
}
}
确保将 textLabel 和 textDetailLabel 的行 属性 设置为 0,这是结果。
基本单元格
右侧详细信息单元格
左侧详细信息单元格
字幕单元格
我会将其报告为错误。