2016-04-26 4 views
0

Эй, у меня есть UITextView внутри UIView, который я динамически загружаю с контентом. Я изменяю размер текстового представления с помощью this solutionИзменить размер UIView для обертывания содержимого с отключенной автоматической компоновкой

У меня отключена автоматическая компоновка, чтобы это можно было работать (другие решения, такие как sizeToFit(), не работали с автоматическим расположением макета ON), но когда я это делаю, даже если весь контент текстового представления делает рендеринг, он переполняет границы его содержания UIView.

Я попытался использовать то же решение, что и для текстового вида на его контейнере, но это ничего не делало.

Одна вещь, которая, кажется, работает это:

newFrame = containerView.frame 
newFrame.size.height = textView.frame.size.height 
containerView.frame = newFrame 

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

Есть ли способ исправить это, не включив автомасштабирование снова? (Будет ли автоматическая компоновка при помощи даже помощи?) И если поворот авто макета будет исправлен, то есть ли способ сохранить динамический размер текстового вида (coz его включение будет нарушить это)?

Я новичок в этом. Цените помощь.

О, и я фактически разрабатываю приложение tvOS, а не iOS. Не знаю, если это имеет значение.

EDIT:

Вот фактический код:

@IBOutlet weak var container: UIView! 
@IBOutlet weak var label: UILabel! 
@IBOutlet weak var text: UITextView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    print(text.frame.origin.x, text.frame.origin.y) 

    text.scrollEnabled = false 

    text.text = "bla blah blah blah boo boo boo boooooo boo blah yo yo yo yo yo hello" 
    let fixedWidth = text.frame.size.width 
    let newSize = text.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max)) 
    var newFrame = text.frame 
    newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height) 
    text.frame = newFrame 
} 

Это динамически расширяет представление текста при изменении содержимого. Добавление:

newFrame = containerView.frame 
newFrame.size.height = textView.frame.size.height 
containerView.frame = newFrame 

изменяет размер контейнера UIView, но делает text.frame.origin.y в текстовом 0. Таким образом, добавление каких-либо других элементов в контейнере просто перекрывается с точки зрения текста.

ответ

0

Вы можете добиться этого как с автозагрузкой, так и с кадрированием. Если вы используете фрейм, вам нужно учитывать высоту всех других компонентов в контейнере. Допустим, у вас есть 3 этикетки, 1 выше TextView и 2 ниже он, имеющий 15 очков, имеет вертикальное расстояние между каждым, то ваша высота containerView должна быть:

newFrame = containerView.frame 
newFrame.size.height = 15 + label1.frame.size.height + 15 + textView.frame.size.height + 15 + label2.frame.size.height + 15 + lable3.frame.size.height + 15 
containerView.frame = newFrame 

С Autolayout вы должны установить правильное вертикальное ограничение между компонентами соответственно изменить размер.

+0

Так что я должен на самом деле жестко кодировать заполнение, которое у меня есть между моими различными компонентами и как добавить их вместе? Это не очень чисто правильно? Я не получил бит вертикальных ограничений. Это что-то, что я могу использовать в UIView, чтобы динамически изменять размер? – alokraop

+0

Непонятно, но перед автозапуском это был только вариант. Вы можете жестко зафиксировать постоянную часть непосредственно до 45. Для Autolayout вы можете пройти через https://www.raywenderlich.com/110393/auto-layout-visual-format-language -tutorial –

+0

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

Смежные вопросы