Изменение размера супервизора и всех его братьев и сестер с помощью автомакета

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

В представлении моего контроллера у меня есть два подпредставления. Назовем их view1 и view2. View1 имеет подвид uitextview, который увеличивается и уменьшается в зависимости от введенного текста.

Проблема, с которой я сталкиваюсь, заключается в том, что view1 и view2 не увеличиваются и не уменьшаются при наборе текста. Константа ограничения для вертикального интервала снизу в текстовом представлении была установлена ​​​​на 10 пикселей из его суперпредставления. Расстояние по вертикали между view1 и view2 установлено равным 0. Вот визуальное представление вида:

 ---------------------
|                     |
|  -----------------  |
| |   UITextView    | |
|  -----------------  |
|        view1        |
 ---------------------
|                     |
|                     |
|                     |
|                     |
|        view2        |
|                     |
|                     |
|                     |
|                     |
|                     |
 ---------------------

Результат, который я получаю, пока добавляю текст в textView:

 ---------------------
|                     |
|  -----------------  |
| |   UITextView    | |
| |                 | |
| |                 | |
 ---------------------
|                     |
|                     |
|                     |
|                     |
|        view2        |
|                     |
|                     |
|                     |
|                     |
|                     |
 ---------------------

Но желаемое поведение будет примерно таким:

 ---------------------
|                     |
|  -----------------  |
| |   UITextView    | |
| |                 | |
| |                 | |
| |                 | |
| |                 | |
| |                 | |
|  -----------------  |
|        view1        |
 ---------------------
|                     |
|                     |
|        view2        |
|                     |
|                     |
|                     |
 ---------------------

Странно то, что после того, как я добавил текст и нажал «Отправить» (не добавлено на диаграмму для простоты), представление 1 увеличивается до правильного размера, как и представление 2, но не во время набора текста.

Нужно ли мне явно вызывать setNeedsUpdateConstraints или updateConstraintsIfNeeded? Если да, то где? Я попытался вызвать его из делегата текстового представления textViewDidChange:, но ничего не помогло.

Любая помощь приветствуется.


person Taz    schedule 08.01.2014    source источник
comment
Вам не нужно обновлять ограничения, поскольку они, вероятно, не меняются. Размер объектов есть, но не ограничение объектов. Попробуйте вызвать setNeedsLayout и layoutIfNeeded при изменении содержимого представления.   -  person James Richard    schedule 08.01.2014
comment
Привет, Джеймс, спасибо за ответ. Нет, я пробовал вызывать [self.view setNeedsLayout] и [self.view layoutIfNeeded] из обратного вызова textViewDidChange, но, похоже, это не работает. Я тоже так думал. Ограничения не должны меняться, а должны меняться представления. Ограничение между текстовым представлением и представлением 1 должно смещать его вниз, в то время как ограничение между представлением 1 и представлением 2 должно уменьшать размер представления 2.   -  person Taz    schedule 09.01.2014
comment
Может быть, UITextView на самом деле не растет? UITextView является подклассом UIScrollView, поэтому типизация, вероятно, не вызывает необходимости изменения фрейма UITextView. Вероятно, это просто обновление contentSize и внутренних представлений, представляющих этот текст.   -  person James Richard    schedule 10.01.2014


Ответы (1)


Мне удалось это выяснить.

Для тех, кто читает это с той же проблемой, я сделал это, написав свой собственный подкласс UITextView, задав ему ограничение по высоте и несколько методов делегата.

При изменении высоты текстового представления просто запустите метод делегата (например, textViewDidChangeHeight:). Затем в реализации обратного вызова делегата я просто вызвал sizeToFit для представления.

person Taz    schedule 22.01.2014