使用排除路径时UITextView自动布局高度

问题描述:

我有一个包含UITextView和UIImageView的UITableViewCell。文本视图禁用了滚动功能。 UITableViewCell确实使用自动布局来计算其高度以适应内容。使用排除路径时UITextView自动布局高度

view layout screenshot

如果有比我想的文本流的图像周围,并使用它下面的空间太截图更多的文本。因此我在文本视图上使用排除路径。排除路径被正确设置,并且文本在图像周围流动。

排除路径必须在自动布局计算出框架后设置。由于排除路径会阻止文本视图上的某些视图空间,因此包含的文本在为文本视图计算的高度自动布局中不再适合

我怎样才能使这个工作与自动布局一起?

我试着设置排除后的路径上设置文本视图的高度约束:

let size = textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: CGFloat(MAXFLOAT))) 
    textView.heightAnchor.constraint(equalToConstant: size.height).isActive = true 

这并没有帮助。我需要在UITableViewCell上调用layoutSubviews()来强制重新计算它的高度。然而,这将创建一个无限循环,因为我在viewDidLayoutSubviews()中设置了排除路径。

+0

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

我有一个类似的问题,我无法在没有太多过度耦合的情况下切实地访问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()。