UITextView внутри UIScrollView с AutoLayout
Я пытаюсь разместить UITextView внутри UIScrollView с помощью AutoLayout без везения. Я пробовал,
- Я разместил UIScrollView внутри основного вида в Storyboard
- Я поместил UITextView внутри UIScrollView в Storyboard и отключил прокрутку.
- Я установил ограничения (ведущий, конечный, верхний, нижний) в UIScrollView
- Я установил ограничения (верхний, верхний, конечный, высота) на UITextView
- Я создал IBOutlet ограничения высоты UITextView
- Я установил текст (много текста, который может вызвать прокрутку) в UITextView в viewDidLoad()
- Я установил ограничение высоты UITextView с помощью кода ниже. Я пробовал это сразу после установки текста в viewDidLoad() и viewDidLayoutSubviews() без везения
self.textViewHeightConstraint.constant = [self.textView sizeThatFits:CGSizeMake(self.textView.frame.size.width, FLT_MAX)].height;
UITextView получает свою высоту, но UIScrollView - нет. Я что-то пропустил?
Ответы
Ответ 1
После нескольких дней исследований и загрязнения рук с помощью UIScrollView + UITextView + Auto Layout я успешно получил полностью работающий UIScrollView. Я хочу поделиться своим решением на случай, если кто-то застрянет в той же ситуации.
- Добавить UIScrollView внутри основного вида в раскадровке
- Добавить UIView внутри UIScrollView
- Добавить UITextView внутри UIView (представление, добавленное на шаге 2)
- Убедитесь, что флажок "Прокрутка включена" UITextView не отмечена.
- Добавить 4 ограничения (ведущий, конечный, верхний, нижний) в UIScrollView
- Добавьте 4 ограничения (ведущий, конечный, верхний, нижний) в UIView (представление, добавленное на шаге 2)
- Добавьте ограничение "Width Equally" на UIView (представление, добавленное на шаге 2) и основной вид
- Добавьте в UITextView 5 ограничений (ведущий, конечный, верхний, нижний, высота). После этого шага вы не должны получать никаких ошибок и предупреждений о ограничениях.
- Добавьте ограничение высоты UITextView IBOutlet на ViewController.
@property (nonatomic, weak) IBOutlet NSLayoutConstraint *textViewHeightConstraint;
и подключите его к раскадровке
- Программно изменить ограничение высоты UITextView.
self.textViewHeightConstraint.constant = [self.textView sizeThatFits:CGSizeMake(self.textView.frame.size.width, CGFLOAT_MAX)].height;
После всех этих 10 шагов вы получите полностью рабочий UIScrollView с UITextView внутри и будьте счастливы.
Ответ 2
Кажется, у этого вопроса есть ответ, который работал для многих людей. Однако следует отметить, что documentation гласит:
Размещение текстового представления внутри прокрутки. Текстовые представления обрабатывают собственную прокрутку. Вы не должны вставлять объекты просмотра текста в представления прокрутки. Если вы это сделаете, может возникнуть непредвиденное поведение, потому что события касания для двух объектов могут быть перемешаны и неправильно обработаны.
Прежде чем пытаться поставить UITextView
в UIScrollView
, вы должны подумать, действительно ли это необходимо. Если текстовое представление является частью сложной компоновки в представлении прокрутки, обратите внимание на использование контейнера UIView
в принятом ответе.
Смотрите также: Прокрутка Просмотров внутри прокрутки Просмотров
Ответ 3
У меня есть рабочий пример вычисления высоты для динамической высоты UITextView + внутри UIStackView, который находится внутри UIScrollView здесь: https://github.com/fassko/ScrollStackViewExample
Ответ 4
Если вы заметили, что Auto Layout все еще жалуется на высоту UIScrollView-
Проблема здесь в том, что по умолчанию UITextView проверил "Включение прокрутки" в IB.
Так что найдите этот флажок и снимите его.
![enter image description here]()
Ответ 5
Решение Sodbileg выше работает, но вам не нужны все его шаги. Я получил свой scrollview, чтобы прокрутить текстовое представление внутри, выполнив его шаги до шага 7. Для шага 8 я добавил 4 ограничения, но не высоту (не забудьте нижнее ограничение !!). Я не делал все остальное.
Я не уверен, но кажется, что высота текстового представления регулируется автоматически, вместо того, чтобы нам приходилось менять его вручную.