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

Как настроить высоту текстового изображения на его содержимое в SWIFT?

На мой взгляд, у контроллера есть UITextView. Это текстовое представление заполнено строкой. Строка может быть короткой или длинной. В зависимости от длины строки высота текста должна настраиваться. Я использую раскадровки и автомат.

У меня есть некоторые проблемы с высотой текста.

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

title1title2

Тексты взяты из моей основной базы данных, они являются строковыми атрибутами. Между экранами 1 и 2 изменяется только строка.
Если я печатаю строки в консоли, у меня есть правильные тексты:

my amazing new title

Another funny title for demo

Ограничения моего текста:

enter image description here

Я не понимаю, почему у меня есть 2 разных дисплея.

ИЗМЕНИТЬ

Я попробовал @Nate совет, в viewDidLoad, я добавил:

    myTextViewTitle.text="my amazing new title"

    myTextViewTitle.setContentHuggingPriority(1000, forAxis: UILayoutConstraintAxis.Vertical)
    myTextViewTitle.setContentCompressionResistancePriority(1000, forAxis: UILayoutConstraintAxis.Vertical)
    myTextViewTitle.setTranslatesAutoresizingMaskIntoConstraints(false)  

    let views = ["new_view": myTextViewTitle]
    var constrs = NSLayoutConstraint.constraintsWithVisualFormat("|-8-[new_view]-8-|", options: NSLayoutFormatOptions(0), metrics: nil, views: views)
    self.view.addConstraints(constrs)
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-8-[new_view]", options: NSLayoutFormatOptions(0), metrics: nil, views: views))
    self.myTextViewTitle.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[new_view([email protected])]", options: NSLayoutFormatOptions(0), metrics: nil, views: views))

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

ИЗМЕНИТЬ 2

Мне нужно UITextView, а не UIlabel, из-за кнопки "Назад", чтобы использовать путь исключения.

     let exclusionPathBack:UIBezierPath = UIBezierPath(rect: CGRect(x:backButton.bounds.origin.x, y:backButton.bounds.origin.y, width:backButton.bounds.width+10, height:backButton.bounds.height))
     myTextViewTitle.textContainer.exclusionPaths=[exclusionPathBack]
4b9b3361

Ответ 1

Я нашел решение.

Я сосредоточился на высоте моего UITextView, затем прочитал сообщение о соотношении сторон. Я хотел попробовать, и это сработало!

Итак, в раскадровке я добавил соотношение сторон для текстового просмотра, и я установил флажок "Удалить во время сборки".

В viewDidLayoutSubviews() я написал:

override func viewDidLayoutSubviews() {

    super.viewDidLayoutSubviews()

    let contentSize = self.myTextViewTitle.sizeThatFits(self.myTextViewTitle.bounds.size)
    var frame = self.myTextViewTitle.frame
    frame.size.height = contentSize.height
    self.myTextViewTitle.frame = frame

    aspectRatioTextViewConstraint = NSLayoutConstraint(item: self.myTextViewTitle, attribute: .Height, relatedBy: .Equal, toItem: self.myTextViewTitle, attribute: .Width, multiplier: myTextViewTitle.bounds.height/myTextViewTitle.bounds.width, constant: 1)
    self.myTextViewTitle.addConstraint(aspectRatioTextViewConstraint!)

}

Он отлично работает.

Ответ 2

Сначала отключите прокрутку UITextView. Два варианта:

  • снимите флажок Прокрутка включена в .xib.
  • [TextView setScrollEnabled: NO];

Создайте UITextView и соедините его с IBOutlet (TextView). Добавьте ограничение высоты UITextView с высотой по умолчанию, соедините его с IBOutlet (TextViewHeightConstraint). Когда вы настроите текст UITextViews асинхронно, вы должны вычислить высоту UITextView и установить для него ограничение по высоте UITextViews. Пример кода:

CGSize sizeThatFitsTextView = [TextView sizeThatFits:CGSizeMake(TextView.frame.size.width, MAXFLOAT)];

TextViewHeightConstraint.constant = sizeThatFitsTextView.height; 

Ответ 3

В Swift 3.0, где tvHeightConstraint - это ограничение по высоте объекта TextView (если он используется для нескольких текстовых просмотров, добавит его в функциональные входы):

func textViewDidChange(textView: UITextView) {

        let size = textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: CGFloat.greatestFiniteMagnitude))
        if size.height != tvHeightConstraint.constant && size.height > textView.frame.size.height{
            tvHeightConstraint.constant = size.height
            textView.setContentOffset(CGPoint.zero, animated: false)
        }
    }

H/T в @cmi и @Pablo Ruan

Ответ 4

В быстрой 2.3:

 func textViewDidChange(textView: UITextView) {

    let size = textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: CGFloat.max))
    if size.height != TXV_Height.constant && size.height > textView.frame.size.height{
        TXV_Height.constant = size.height
        textView.setContentOffset(CGPointZero, animated: false)
    }
}

Ответ 5

Почему у вас нет изображения для кнопки "Назад" и UILabel для вашего текста и используйте автозапуск, чтобы разместить их? И, возможно, третий вид для желтого фона.

Ответ 6

Мое простое решение для очень похожей проблемы:

Я использовал метки с количеством строк, установленным в 0, вместо того, чтобы пытаться использовать текстовые поля или представления. Затем я обрезал передний и задний края контейнеров этикеток, которые ограничивают их ширину в моем случае, причем 0 является константой для ограничений. Уловкой является установка количества строк в 0, чтобы позволить ярлыкам расти или сокращаться в соответствии с их содержанием. Текст никогда не прерывается, а высота ярлыков никогда не превышает их содержимого "для всех разных классов размера, которые я настроил для ширины (ширина контейнера в моем случае). Протестировано для IOS 8.0 и более поздних версий (также убедитесь, что флажок" Явный "не отмечен рядом с атрибутами" Предпочтительная ширина" для всех таблиц для ширины меток для настройки для разных классов размеров) - отлично работает.