I have a UITextView
that can potentially change size. Scrolling is disabled. Here what's happening:
Is there any way to prevent this strange behaviour but also keep the lineBreakMode to .byTruncatingTail
? (removing this option produces the expected resize result)
The playground code so you can reproduce this easily:
import UIKit
import PlaygroundSupport
class HostController: UIViewController {
let textView = UITextView()
override func viewDidLoad() {
view.backgroundColor = .gray
textView.frame = CGRect(x: 10, y: 10, width: 150, height: 200)
textView.isEditable = false
textView.isScrollEnabled = false
textView.textContainer.lineBreakMode = .byTruncatingTail
textView.text = "Line 1\n\n\n\nLine 2\n\nLine 3\n\nLine 4\nSome text that goes beyond the width"
view.addSubview(textView)
let slider = UISlider(frame: CGRect(x: 160, y: 10, width: 100, height: 30))
slider.minimumValue = 10
slider.maximumValue = 200
slider.value = 200
slider.addTarget(self, action: #selector(sliderChanged(sender:)), for: .valueChanged)
view.addSubview(slider)
}
@objc func sliderChanged(sender: UISlider) {
textView.frame.size.height = CGFloat(sender.value)
}
}
let vc = HostController()
PlaygroundPage.current.liveView = vc
Turns out that if you add an empty space character between the new lines the problem is disappearing. For the example above, that would be: