没有 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?
通过 Storyboard 创建时如何学习 Swift 命令? [关闭]