【问题标题】:What is the best way to dynamic cell content?动态单元格内容的最佳方法是什么?
【发布时间】:2019-05-09 18:36:06
【问题描述】:

我正在使用 collectionView 创建一个提要应用程序并完成了大部分工作,但我有一些问题需要改进我的代码: 例如,我有一个这样的状态单元格:

通常,对于动态单元格内容,我将在委托 sizeForItemAt 中调整单元格的大小,如下所示:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    print(")-Layouting each cell")

    let textView = UITextView()
    textView.isScrollEnabled = false
    textView.font = UIFont.preferredFont(forTextStyle: .subheadline)
    textView.text = posts[indexPath.item].statusText

    let estimatedSizeForStatus = textView.sizeThatFits(CGSize(width: view.frame.width, height: .infinity))


    return CGSize(width: view.frame.width, height: 470 + estimatedSizeForStatus.height)
}

但我很难维护代码。当我想更改状态字体大小时,我必须替换 2 个位置的代码(在委托和单元类中)。

有没有更好的方法来改善这一点?

【问题讨论】:

    标签: swift dynamic uicollectionviewcell


    【解决方案1】:

    您可以将表格视图或集合视图与自动调整大小的自定义单元格和自动布局一起使用:

    https://www.raywenderlich.com/8549-self-sizing-table-view-cells

    https://engineering.shopspring.com/dynamic-cell-sizing-in-uicollectionview-fd95f614ef80

    为了显示文本 - 您可以使用 UILabel 代替 UITextView。将 .numberOfLines 设置为 0,这将允许它根据需要调整大小。并且不要忘记为其添加适当的前导、尾随、顶部和底部约束。

    更高级:

    • 您可以创建自定义 .plist、.xml、.json 等文件,其中包含所有 UI 信息/主题设置,您将在其中保留每个标签、按钮等的字体名称和大小

    • 加载该信息并使其可用于视图控制器

    • 检查是否在该文件中指定了自定义字体。如果是 - 使用它,代码将在任何地方使用它。如果否 - 只需像上面那样使用一些默认文本。

    • 您必须在可能需要使用“动态视图样式”值的任何地方使用三元运算符或合并运算符。

    你的代码会变成这样:

    textView.font = ThemeSettings.headerTextFont() != nil ? ThemeSettings.headerTextFont() : UIFont.preferredFont(forTextStyle: .subheadline)
    

    或:

    textView.font = ThemeSettings.headerTextFont() ?? UIFont.preferredFont(forTextStyle: .subheadline)
    

    而且,您必须在使用取决于特定 UI 元素字体的类似代码的任何其他地方执行相同操作。

    优点是您再也不用弄乱代码了,只需在 ThemeSettings 文件中处理一次。

    【讨论】:

    • 非常感谢,@ppalancica。但我希望有一个更有效的方法。我的意思是一种我不需要估计委托中文本大小的方法。
    • 如果您使用带有自动调整行大小的表格视图,则不必编写 heightForRow(at:) 方法。系统会为你计算。在此处查看示例:raywenderlich.com/8549-self-sizing-table-view-cells
    • 我喜欢以编程方式编码(不使用情节提要),并且由于其自定义,我通常使用集合视图来获取数据列表。但我会考虑你的观点,谢谢@ppalancica
    • 刚刚发现一篇文章也解释了如何为集合视图单元格执行此操作:engineering.shopspring.com/… 请注意,无论是通过编程方式还是在情节提要中,单元格都必须能够根据你会做的限制。
    猜你喜欢
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多