一旦在 Swift 中达到最大高度,UITextView 就会变得可滚动

UITextView that becomes scrollable once a max height is reached in Swift

我目前有一个不可滚动的 UITextView,它可以动态扩展以适应任何文本。但是,我很难弄清楚的是,如果 textview 的高度大于设定高度,如何阻止它增加高度 - 在这一点上,我希望它变得可滚动。

图片

Example

绿色:biggerParentView

黄色:parentViewContainer

青色:随机标签

红色:myTextView

正在设置 myTextView

myTextView.translatesAutoresizingMaskIntoConstraints = false
myTextView.text = "This is a large chunck that has no meaning, especially to everyone reading this."
myTextView.isScrollEnabled = false        

parentViewContainer.addSubview(myTextView)

约束条件

parentViewContainer.leadingAnchor.constraint(equalTo: biggerParentView.leadingAnchor, constant: 0).isActive = true
parentViewContainer.trailingAnchor.constraint(equalTo: biggerParentView.trailingAnchor, constant: 0).isActive = true
parentViewContainer.topAnchor.constraint(equalTo: randomLabel.topAnchor).isActive = true
parentViewContainer.bottomAnchor.constraint(equalTo: myTextView.bottomAnchor).isActive = true

randomLabel.leadingAnchor.constraint(equalTo: parentViewContainer.leadingAnchor, constant: 15).isActive = true
randomLabel.trailingAnchor.constraint(equalTo: parentViewContainer.trailingAnchor, constant: -15).isActive = true
randomLabel.heightAnchor.constraint(equalToConstant: 50).isActive = true

myTextView.leadingAnchor.constraint(equalTo: parentViewContainer.leadingAnchor, constant: 15).isActive = true
myTextView.trailingAnchor.constraint(equalTo: parentViewContainer.trailingAnchor, constant: -15).isActive = true
myTextView.topAnchor.constraint(equalTo: randomLabel.bottomAnchor, constant: 20).isActive = true

问题

当前示例适用于短文本,但如果我要将 myTextView 中的文本更改为整个 两城传说,myTextView 及其 parentViewContainer , 将永远扩展到屏幕外。我如何确保 myTextView 及其父级只能动态扩展到此为止,此时 myTextView 将变为可滚动?

感谢 matt 为我指明了正确的方向。关键是把逻辑放在viewDidLayoutSubviews()中。

var myTextViewHeightConstraint: NSLayoutConstraint!

override func viewDidLoad() {
    myTextViewHeightConstraint = NSLayoutConstraint(item: myTextView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 0.0, constant: 0)
    myTextViewHeightConstraint.isActive = false
}

override func viewDidLayoutSubviews() {
    let h = self.myTextView.contentSize.height
    let limit = self.myTextView.frame.height - randomLabel.frame.height - 20 //20 is the distance constraint between randomLabel and myTextView

    if h > limit && !self.myTextView.isScrollEnabled {
           self.myTextView.isScrollEnabled = true
           self.myTextViewHeightConstraint.constant = limit
           self.myTextViewHeightConstraint.isActive = true
           }

     else if h < limit && self.myTextView.isScrollEnabled {     
           self.myTextView.isScrollEnabled = false
           self.myTextViewHeightConstraint.isActive = false
     }
   }
}