使用排除路径时UITextView自动布局高度
问题描述:
我有一个包含UITextView和UIImageView的UITableViewCell。文本视图禁用了滚动功能。 UITableViewCell确实使用自动布局来计算其高度以适应内容。使用排除路径时UITextView自动布局高度
如果有比我想的文本流的图像周围,并使用它下面的空间太截图更多的文本。因此我在文本视图上使用排除路径。排除路径被正确设置,并且文本在图像周围流动。
排除路径必须在自动布局计算出框架后设置。由于排除路径会阻止文本视图上的某些视图空间,因此包含的文本在为文本视图计算的高度自动布局中不再适合。
我怎样才能使这个工作与自动布局一起?
我试着设置排除后的路径上设置文本视图的高度约束:
let size = textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: CGFloat(MAXFLOAT)))
textView.heightAnchor.constraint(equalToConstant: size.height).isActive = true
这并没有帮助。我需要在UITableViewCell上调用layoutSubviews()
来强制重新计算它的高度。然而,这将创建一个无限循环,因为我在viewDidLayoutSubviews()
中设置了排除路径。
答
我有一个类似的问题,我无法在没有太多过度耦合的情况下切实地访问viewDidLayoutSubviews(),所以我感觉到你的痛苦。
假设您有视图A并且子视图包含UITextView。
鉴于A,重写layoutSubviews()
override public func layoutSubviews() {
super.layoutSubviews()
// At this point, UITextView is laid out and has a valid frame.
// Set exclusion paths here, now that you have enough info to set coordinates.
super.layoutSubviews() // do it again.
}
这类似于用的UILabel和maxPreferredWidth先前IOS版本所采取的方法。 iOS: Multi-line UILabel in Auto Layout
警告:我不知道,在这里设置一个约束会帮助你,作为布局周期真的不工作的方式,但根据本Update Constraints of Cell Subview,你也许能逃脱做layoutIfNeeded()。
UIView有一个特殊的功能来更新约束。也许尝试像这样覆盖它: 'override func updateConstraints(){ super.updateConstraints() let size = textView.sizeThatFits(CGSize(width:textView.frame.size.width,height:CGFloat(MAXFLOAT))) textView.heightAnchor.constraint(equalToConstant:size.height).isActive = true }' – DisableR