我正在使用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个地方(在委托和单元格类中)替换代码。
是否有更好的方法来改善这一点?
答案 0 :(得分:0)
您可以将表视图或集合视图与自动调整大小的自定义单元格和自动布局一起使用:
https://www.raywenderlich.com/8549-self-sizing-table-view-cells
https://engineering.shopspring.com/dynamic-cell-sizing-in-uicollectionview-fd95f614ef80
为显示文本-您可以使用UILabel代替UITextView。将.numberOfLines设置为0,这将使其可以调整为所需的大小。并且不要忘记为其添加适当的前导,尾随,顶部和底部约束。
更高级:
您可以创建一个包含所有UI信息/主题设置的自定义.plist,.xml,.json等文件,在其中您将保留每个标签,按钮等的字体名称和大小
加载该信息并将其提供给View Controller
检查是否在该文件中指定了自定义字体。如果是,请使用它,并且代码将在所有地方使用它。如果否,请像上面一样使用一些默认文本。
您可能需要在所有需要使用“动态视图样式”值的地方使用三元运算符或合并运算符。
您的代码将变成这样:
textView.font = ThemeSettings.headerTextFont() != nil ? ThemeSettings.headerTextFont() : UIFont.preferredFont(forTextStyle: .subheadline)
或:
textView.font = ThemeSettings.headerTextFont() ?? UIFont.preferredFont(forTextStyle: .subheadline)
而且,您必须在使用类似代码(取决于特定UI元素的字体)的任何其他位置执行相同操作。
优点是您将不再需要弄乱代码,而只需在ThemeSettings文件中执行一次即可。