Подтвердить что ты не робот

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 - нет. Я что-то пропустил?

4b9b3361

Ответ 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 ограничения, но не высоту (не забудьте нижнее ограничение !!). Я не делал все остальное.

Я не уверен, но кажется, что высота текстового представления регулируется автоматически, вместо того, чтобы нам приходилось менять его вручную.