在自定义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 的大小