【问题标题】:UITextView that becomes scrollable once a max height is reached in Swift一旦在 Swift 中达到最大高度,UITextView 就会变得可滚动
【发布时间】:2019-10-24 20:03:32
【问题描述】:

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

图片

Example

绿色:更大的父视图

黄色: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 将变为可滚动?

【问题讨论】:

标签: ios swift uitextview


【解决方案1】:

感谢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
     }
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    相关资源
    最近更新 更多