一旦在 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
}
}
}
我目前有一个不可滚动的 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
}
}
}