Xcode - Swift, UITextView не отображается в UIStackView

Я знаю, что уже есть вопрос, похожий на этот, но его решение не решило мою проблему.

Что у меня есть, я использовал раскадровку для создания контроллера представления, а затем поместил дочернее представление стека поверх.

Используя IBOutlet, я связал UIStackView с классом настраиваемого контроллера представления.

Все правильно связано, проблема не в этом (я убедился).

Моя проблема в том, что я не могу отобразить UITextView в UIStackView.

вот мой код (внутри функции в контроллере представления):

let textView = UITextView()
textView.text = "test"
stackView.addArrangedSubview(textView) //stackView is the IBOutlet

Мне удалось отобразить UITextView в родительском представлении, используя

let pos = CGRect(x: 100, y: 100, width: 200, height: 200)
let textView = UITextField(frame: pos)
textView.text = "test"
//stackView.addArrangedSubview(textView)
self.view.addSubview(textView)

И нет, раскомментировать строку с помощью stackView, а затем закомментировать self.view.addSubview не получится.

Но мне удается заставить что-то появиться в UITabView, если я использую UITextField. Это не раздражает ....

Какие-либо предложения?


person HumbleWebDev    schedule 27.04.2016    source источник


Ответы (5)


Представление стека не знает размер текстового представления, потому что по умолчанию оно прокручивается. Вам нужно отключить прокрутку:

textView.isScrollEnabled = false
person Sune    schedule 08.11.2016
comment
Это лучший ответ для тех, кто использует автоопределение. - person Dean Kelly; 10.05.2017
comment
Это должен быть принятый ответ. Это была именно моя проблема, и этот лайнер сразу исправили. - person Mauricio Chirino; 21.02.2018
comment
Привет, у меня еще есть небольшая проблема, потому что высота текстового представления управляется на основе назначенного ему текста, но я хочу отображать эту высоту на основе ограничения нижнего якоря stackview. Так как же с этим справиться? - person puja; 19.03.2018
comment
@puja: Я не уверен, что понимаю вашу проблему, но похоже, что вы можете взглянуть на настройку свойства распределения для stackview. - person Sune; 19.03.2018
comment
@MauricioChirino нет, если вам нужно поведение прокрутки, и в этом случае ответ Medmind - лучший вариант (например, явная установка ограничения позиционирования). - person Kheldar; 11.12.2018

Вы должны добавить ограничения 0 слева и справа от текстового представления в стек.

person MedMind    schedule 28.06.2018

Вы не должны смешивать ручную настройку фрейма с AutoLayout (что UIStackView использует для внутренних целей). Ответ @ Lawrence413 неверен и неправильно использует UIStackView.

Ниже приведено сообщение в блоге, описывающее UIStackView и способы его использования: http://www.raizlabs.com/dev/2016/04/uistackview/.

Обратите внимание на UIStackViewDistribution и на то, как он используется для изменения размера arrangedSubviews.

person bsmith11    schedule 29.04.2016

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

person saswanb    schedule 08.02.2018

Вам нужна рамка для UITextView. И используйте addSubview вместо addArrangedSubview.

Я использовал следующее, и текстовое представление отлично отображалось в представлении стека:

let textView = UITextView(frame: CGRectMake(0, 0, 100, 100))
textView.text = "test"
textView.backgroundColor = UIColor.redColor()
stackView.addSubview(textView)
person Lawrence413    schedule 27.04.2016
comment
Большое тебе спасибо. Это сработало для меня. Это странно, но в онлайн-руководстве, которое я прочитал, говорится, что избегайте addSubview с помощью stackview и используйте addArrangedSubview. Кажется, это правильное решение. Изменить: похоже, теперь есть новая проблема, UITextView не будет редактировать. И да, я добавляю строку textView.editable = true - person HumbleWebDev; 28.04.2016
comment
Edit2: это также, похоже, полностью нарушает функциональность UIStackView, поскольку он должен автоматически складывать новые элементы при добавлении. Если вы используете этот метод для добавления второго UITextView, они накладываются друг на друга. - person HumbleWebDev; 28.04.2016
comment
Они накладываются друг на друга, потому что имеют одинаковые координаты (x: 0, y: 0) (если вы устанавливаете один и тот же кадр). Вы можете попробовать просто установить ширину и высоту текстового представления и посмотреть, будет ли оно автоматически организовано в представлении стека. Я попробовал addArangedSubview, но текстовое представление не появилось, поэтому я и предложил это. Если бы вы конкретно сказали нам, чего хотите достичь, люди могли бы помочь вам более точно. Вы хотите программно добавить больше текстовых представлений в представление стека? Я изучу свой код и посмотрю, чем могу вам помочь. - person Lawrence413; 29.04.2016