自动布局 UITableViewCells 覆盖底部
Posted
技术标签:
【中文标题】自动布局 UITableViewCells 覆盖底部【英文标题】:Autolayout UITableViewCells covering up bottom 【发布时间】:2019-12-14 16:40:34 【问题描述】:我遇到了这个 UITableViewCell 的问题。我从服务器获取字符串并将其插入到 viewDidLoad 中,但是单元格的底部,即 summaryLabel 被覆盖了。是插页吗? Here's the code:
class SummaryTableViewCell: UITableViewCell
let titleLabel = UILabel()
let createdLabel = UILabel()
let summaryLabel = UILabel()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?)
super.init(style: style, reuseIdentifier: reuseIdentifier)
titleLabel.numberOfLines = 2
titleLabel.lineBreakMode = .byWordWrapping
titleLabel.font = UIFont.boldSystemFont(ofSize: 23)
summaryLabel.numberOfLines = 4
summaryLabel.lineBreakMode = .byWordWrapping
contentView.clipsToBounds = true
titleLabel.translatesAutoresizingMaskIntoConstraints = false
createdLabel.translatesAutoresizingMaskIntoConstraints = false
summaryLabel.translatesAutoresizingMaskIntoConstraints = false
contentView.addSubview(titleLabel)
contentView.addSubview(createdLabel)
contentView.addSubview(summaryLabel)
let lg = contentView.safeAreaLayoutGuide
NSLayoutConstraint.activate([
titleLabel.topAnchor.constraint(equalTo: lg.topAnchor),
titleLabel.leadingAnchor.constraint(equalTo: lg.leadingAnchor),
titleLabel.trailingAnchor.constraint(equalTo: lg.trailingAnchor),
titleLabel.bottomAnchor.constraint(equalTo: createdLabel.topAnchor),
createdLabel.leadingAnchor.constraint(equalTo: lg.leadingAnchor),
createdLabel.trailingAnchor.constraint(equalTo: lg.trailingAnchor),
createdLabel.bottomAnchor.constraint(equalTo: summaryLabel.topAnchor, constant: -8),
summaryLabel.leadingAnchor.constraint(equalTo: lg.leadingAnchor),
summaryLabel.trailingAnchor.constraint(equalTo: lg.trailingAnchor),
summaryLabel.bottomAnchor.constraint(equalTo: lg.bottomAnchor)
])
override func layoutSubviews()
super.layoutSubviews()
contentView.frame = contentView.frame.inset(by: UIEdgeInsets(top: 15, left: 17, bottom: 15, right: 17))
required init?(coder aDecoder: NSCoder) super.init(coder: aDecoder)
【问题讨论】:
【参考方案1】:不要将自动布局与设置 frame
的 contentView
表示的框架布局混合,所以用常量替换
titleLabel.topAnchor.constraint(equalTo: lg.topAnchor,constant:15),
summaryLabel.bottomAnchor.constraint(equalTo: lg.bottomAnchor,constant:-15)
并将所有 lbls 的前导和尾随更改为类似的内容
titleLabel.leadingAnchor.constraint(equalTo: lg.leadingAnchor,constant:17),
titleLabel.trailingAnchor.constraint(equalTo: lg.trailingAnchor,constant:-17),
【讨论】:
【参考方案2】:另一个选项,可以节省一些精力并且如果您决定更容易调整:
contentView.layoutMargins = UIEdgeInsets(top: 15, left: 17, bottom: 15, right: 17)
let lg = contentView.layoutMarginsGuide
然后你可以保持你的约束不变(不需要设置所有的常量),你可以完全删除你的layoutSubviews()
func。
【讨论】:
以上是关于自动布局 UITableViewCells 覆盖底部的主要内容,如果未能解决你的问题,请参考以下文章
无法滚动包含 UITextFields 的 UITableViewCells
屏幕外 UITableViewCells(用于大小计算)不尊重大小类?
回收时不会重新布局自定义 iOS UITableViewCells