没有 Storyboard 的 Swift UITableViewCell 不使用自动布局

Posted

技术标签:

【中文标题】没有 Storyboard 的 Swift UITableViewCell 不使用自动布局【英文标题】:Swift UITableViewCell without Storyboard don't use Auto layout 【发布时间】:2018-05-08 08:47:40 【问题描述】:

我正在尝试使用定义 UITableViewCell 的类来编写没有 Storyboard 的 UITableViewController。 我根据需要配置了表格视图

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 200.0  
tableView.register(HomeCell.self, forCellReuseIdentifier: "cell")

并创建了一个只有一个图标的HomeCell UITableViewCell 类。

override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    icon = UIImageView(frame: CGRect.zero);
    icon.translatesAutoresizingMaskIntoConstraints = false;
    contentView.addSubview(icon)

我在类中插入了用于自动布局的函数,并通过调试控制了该函数的调用:

override func layoutSubviews() 
    icon.heightAnchor.constraint(equalToConstant: 50).isActive = true
    icon.widthAnchor.constraint(equalToConstant: 50).isActive = true
    icon.leftAnchor.constraint(equalTo: contentView.leftAnchor,
                               constant: 5).isActive = true
    icon.topAnchor.constraint(equalTo: contentView.topAnchor,
                              constant: 5).isActive = true
    contentView.bottomAnchor.constraint(equalTo: icon.bottomAnchor, constant: 5).isActive = true
 

结果是我的图标在正确的位置,但是contentView的高度错误,即UITableViewAutomaticDimension设置的44的原始大小,连续行重叠。 有人知道出了什么问题吗?

【问题讨论】:

底部锚点isActive 不见了? layoutSubviews 被多次调用,您的代码有效地多次添加相同的约束集,这无论如何都不需要,因此请将所有添加约束的代码移至 init 对不起,是一个错误的副本,但结果是内容视图的高度相同并且图标被压缩了。 【参考方案1】:

你应该激活约束 a

override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    icon = UIImageView(frame: CGRect.zero);
    icon.translatesAutoresizingMaskIntoConstraints = false;
    contentView.addSubview(icon)
    setContr()
 
func setContr() 

    icon.heightAnchor.constraint(equalToConstant: 50).isActive = true
    icon.widthAnchor.constraint(equalToConstant: 50).isActive = true
    icon.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 5).isActive = true
    icon.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 5).isActive = true
    contentView.bottomAnchor.constraint(equalTo: icon.bottomAnchor, constant: 5).isActive = true

【讨论】:

这是正确的解决方案。我使用 setNeedsLayout 激活控制器中的约束,但如果创建了单元格,则高度保持不变。通过这种方式,单元格被创建为具有正确的高度。非常感谢

以上是关于没有 Storyboard 的 Swift UITableViewCell 不使用自动布局的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 Storyboard 的情况下推送新视图 Swift

如何将 ViewController.swift 连接到 Storyboard 中的 ViewController?

iOS Storyboard约束详解

通过 Storyboard 创建时如何学习 Swift 命令? [关闭]

不使用 Storyboard segues 的自定义视图转换 (Swift)

使用swift iOS8通过代码将约束设置到Storyboard中的元素