在 iOS 9 上,所有 uitableviewcells 都变成一行

Posted

技术标签:

【中文标题】在 iOS 9 上,所有 uitableviewcells 都变成一行【英文标题】:All uitableviewcells become one line in height on iOS 9 【发布时间】:2015-09-11 17:25:59 【问题描述】:

我有一个带有多个 UITableView 控制器的应用程序。在 ios 8.x 上运行时,每个表格中所有单元格的高度都会调整大小以适应单元格的内容(所有单元格都只包含一个带有纯文本的 UILabel)。现在在 iOS 9 上运行时,每张桌子上的每个单元格都只有一行高。这适用于动态和静态表。我已经搜索了 UIKit diffs 文档并进行了广泛的搜索,但除了所有表格中所有单元格的一行高度之外,我找不到正确的组合。

【问题讨论】:

我可以通过将其添加到 viewDidLoad self.tableView.estimatedRowHeight = 100.0; self.tableView.rowHeight = UITableViewAutomaticDimension; 来修复带有动态单元格的表格,但我仍然没有找到修复带有静态单元格的表格的方法。 由于某种原因,在情节提要中设置 numberOfLines = 0 不起作用。在 cellForRowAtIndexPath 中设置它有助于获得适当的高度。此外,调用委托的估计行高度有助于使边距更具视觉吸引力。 【参考方案1】:

我遇到过类似的情况。诀窍似乎是通过UITableView 的委托方法显式实现动态调整大小。尽管情节提要中的设置automatic 应该 可以工作 - 但事实并非如此。解决方案是通过委托方法显式提供UITableViewAutomaticDimension,然后像往常一样提供估计的单元格大小:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    return UITableViewAutomaticDimension;


- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath 

    /* Return an estimated height or calculate 
     * estimated height dynamically on information 
     * that makes sense in your case.
     */
    return 200.0f;

如果有人确切地知道为什么这在 iOS 9 中是必需的以及它与 iOS 8 有何不同,我很想听听。

【讨论】:

【参考方案2】:

我们可以使用 iOS 8 中的“UITableViewAutomaticDimension”通过以下两个属性显式地实现动态调整大小:-

tableView.estimatedRowHeight = 60.0
tableView.rowHeight = UITableViewAutomaticDimension

然后在“cellForRowAtIndexPath”方法中在返回单元格之前添加以下代码。

cell.setNeedsUpdateConstraints()
cell.updateConstraintsIfNeeded()

对于 iOS 9 我们可以添加 tableView 的委托方法:-

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat 
    return UITableViewAutomaticDimension

【讨论】:

【参考方案3】:

在 iOS 9-10 上使用 layoutMargins

时存在 UIStackView 问题
extension UIStackView 
    open override func didMoveToSuperview()    // a workaround for stackview issues on iOS 9-10
        super.didMoveToSuperview()
        if #available(iOS 11.0, *)   else 
            layoutMargins = self.layoutMargins
        
    

【讨论】:

以上是关于在 iOS 9 上,所有 uitableviewcells 都变成一行的主要内容,如果未能解决你的问题,请参考以下文章

无法在 iOs 9.1 Adob​​e Air 上启动应用程序(并非所有设备)

我可以在 Xcode Server 中的所有设备上运行单元测试并仅在 iOS 9.x 设备上运行 UI 测试吗?

Xcode 7:iOS 9 模拟器上没有 launchImage

iOS:iOS 9 上 iPad 的 TableViewCell 背景

怎么获取ios 设备上 所有app的信息

RSA 加密仅在运行 iOS 9 的 iPhone 4s 上失败