По умолчанию для UITextView
включена прокрутка.
Хотя это кажется очевидным, это позволяет пользователю вводить больше строк текста, чем уместится в рамке, и пользователь может прокручивать текст вверх и вниз.
Для того, чтобы это случается, UIKit
должен знать рамку текстового представления. Если кадр не задан, UIKit
не может узнать, сколько строк нужно отобразить или насколько широко должен быть вид. Таким образом, если мы не предоставим текстовому представлению полный набор ограничений, автоматическое размещение даст ему размер .zero
. Даже если задано ограничение ширины (или максимальной ширины), автоматическое размещение все равно не знает, сколько прокручиваемых строк текста мы хотим отобразить.
Настройка .isScrollEnabled = false
в текстовом представлении меняет все это.
Теперь, если мы ограничим только положение и width текстового представления, UIKit
вычислит высоту на основе размера содержимого .text
свойство.
Это легко показать. Мы создадим два текстовых представления, дадим им каждое ограничение верхней, верхней и максимальной ширины (lessThanOrEqualTo) и один и тот же текст ... но установим .isScrollEnabled = false
для одного из них:
class TextViewTestViewController: UIViewController {
let nonScrollingTextView = UITextView()
let scrollingTextView = UITextView()
override func viewDidLoad() {
super.viewDidLoad()
let s = "This is a test string to demonstrate UITextView size behavior."
[nonScrollingTextView, scrollingTextView].forEach {
tv in
tv.translatesAutoresizingMaskIntoConstraints = false
tv.font = UIFont.systemFont(ofSize: 17.0)
tv.text = s
view.addSubview(tv)
}
let g = view.safeAreaLayoutGuide
NSLayoutConstraint.activate([
nonScrollingTextView.topAnchor.constraint(equalTo: g.topAnchor, constant: 40.0),
nonScrollingTextView.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 40.0),
nonScrollingTextView.widthAnchor.constraint(lessThanOrEqualToConstant: 300.0),
scrollingTextView.topAnchor.constraint(equalTo: nonScrollingTextView.bottomAnchor, constant: 40.0),
scrollingTextView.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 40.0),
scrollingTextView.widthAnchor.constraint(lessThanOrEqualToConstant: 300.0),
])
// disable scrolling on the "top" text view
nonScrollingTextView.isScrollEnabled = false
// top text view is cyan
nonScrollingTextView.backgroundColor = .cyan
// bottom text view is green (although we won't see it)
scrollingTextView.backgroundColor = .green
}
}
Результат :
Мы добавили два текстовых представления, но отключили прокрутку только на «верхнем» (голубой фон). Мы даже не видим второй (зеленый фон), потому что автоматическое расположение дает ему высоту Ноль.
Стоит отметить ... если в текстовом представлении отключена прокрутка и если редактирование включено, оно будет автоматически увеличиваться / уменьшаться по мере добавления / удаления текста пользователем.