在自定义tableviewcells中添加约束的最佳位置在哪里?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在自定义tableviewcells中添加约束的最佳位置在哪里?相关的知识,希望对你有一定的参考价值。
我知道添加约束的最佳位置是viewDidLoad,但对于自定义视图,特别是对于自定义单元格,我想将所有这些布局细节隐藏到自身,而不暴露给它的控制器。而且我不希望VC向其视图发送消息,因为它对耦合有一点贡献,我最讨厌。所以我应该在init方法或layoutSubview中添加约束,还是其他什么?
答案
如果不使用故事板,我会说添加约束的最佳位置是UITableViewCell
的init方法:
class CustomTableViewCell : UITableViewCell {
lazy var subview: UIView = {
let view = UIView()
view.backgroundColor = .orange
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
contentView.addSubview(subview)
NSLayoutConstraint.activate([
subview.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
subview.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
subview.topAnchor.constraint(equalTo: contentView.topAnchor),
subview.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
subview.heightAnchor.constraint(equalToConstant: 230.0)
])
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
另一答案
对于UITableViewCell
子类,通常会在将子视图添加到视图层次结构的任何位置添加约束。
- 对于NIB中的控件,我将在Interface Builder中添加约束,从而无需以编程方式执行任何操作。
- 如果您正在使用NIB,但由于某种原因选择不将约束放在XIB中,您可以在
awakeFromNib
中以编程方式创建约束。您不会尝试在init(coder:)
中添加这些约束,因为这些插座尚未连接起来。你想在awakeFromNib
做到这一点,在这一点上他们联系起来。 - 如果您正在使用NIB,但是再次以编程方式添加一些其他子视图,则需要在
awakeFromNib
中添加这些子视图及其相关约束。如果这些新的子视图不需要任何@IBOutlet
引用,理论上你也可以在init(coder:)
中做到这一点。 - 如果您没有使用NIB,而是完全以编程方式创建单元格的子视图,则通常在
init(coder:)
或init(style:reuseIdentifier:)
中执行此操作,具体取决于cellForRowAt
如何实例化单元格。 现在,您通常会为表视图的重用标识符注册一个类,然后cellForRowAt
只会dequeueReusableCell(withIdentifier:for:)
,在这种情况下,您将在init(coder:)
中进行此单元格自定义。 回到ios之前有这个dequeueReusableCell(withIdentifier:for:) method
例程(即我们只有没有IndexPath
参数的再现),我们调用dequeueReusableCell(withIdentifier:)
,如果它返回nil
,我们将使用init(style:reuseIdentifier:)
手动实例化单元格。但是这种技术已经不再使用了。 从历史的角度来看,值得注意的是,您可能仍然偶然发现了在cellForRowAt
中添加单元格子视图的旧代码。但我们通常更喜欢将此单元格自定义代码移动到UITableViewCell
子类中,以帮助最小化视图控制器膨胀。
底线,您可以在将视图层次结构添加到视图层次结构的任何位置添加约束,以及将其放入哪种方法取决于您实例化单元格的方式。
以上是关于在自定义tableviewcells中添加约束的最佳位置在哪里?的主要内容,如果未能解决你的问题,请参考以下文章
在自定义 TableViewCell 中动态更改 UILabel 框架
如何在自定义 tableViewCell 中初始化 UiPickerView?
在自定义 tableviewcell 中更改 UIImage
无法在自定义 TableViewCell 中编辑 UITextView
iOS:为啥在自定义 TableViewCell 中写入此文本字段的文本似乎不可读
我在自定义 TableViewCell 中有一个 UICollectionView,但我无法自动调整 CollectionView 的大小