Сделать динамическую высоту UITextView, проблема с множителем ограничения - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть UICollectionView, который содержит пять ячеек. Там у меня есть UIImageView, две UILabels и UITextView. Я хочу изменить высоту текстового представления на основе текста, который он содержит, поэтому после этого я могу установить высоту всей ячейки на основе высоты UITextView и надписей над ними. Позвольте мне продемонстрировать со скриншотом .

Итак, как вы можете сказать, красный фон показывает, что высота UITextView не верна. Я настроил UITextView так:

    let commentTextView: UITextView = {

    let textView = UITextView()
    textView.translatesAutoresizingMaskIntoConstraints = false
    textView.text = "This is just some text to act as a description"
    textView.textContainerInset = UIEdgeInsets(top: 0, left: -4, bottom: 0, right: 0)
    textView.font = UIFont.systemFont(ofSize: 16.0)
    textView.textColor = UIColor.darkGray
    textView.isEditable = false
    textView.isSelectable = false
    textView.backgroundColor = UIColor.red

    textView.frame.size.width = (UIScreen.main.bounds.width - 16 - 16 - 60 - 8)

    let numberOfLines = (textView.contentSize.height / textView.font!.lineHeight)
    var textViewHeight = (textView.font?.lineHeight)! * floor(numberOfLines)

    textView.frame.size.height = textViewHeight

    return textView

}()

Это не создает неправильную высоту, я думаю. Я думаю, что проблема может быть найдена в моих ограничениях, которые имеют ограничение по высоте (если я удаляю его, UITextView исчезает). Если я изменю множитель (в настоящее время установлен на 0,3), у меня будут разные высоты, но я хочу, чтобы это было динамически. Так что, по моему мнению, мне нужно было бы установить динамическую переменную внутри множителя, но я не знаю, как ее составить. Может ли кто-нибудь помочь? Вот мои ограничения:

        // top constraints
    addConstraints([NSLayoutConstraint(item: commentTextView, attribute: .top, relatedBy: .equal, toItem: workoutLabel, attribute: .bottom, multiplier: 1, constant: 2)])

    // left constraint
    addConstraints([NSLayoutConstraint(item: commentTextView, attribute: .left, relatedBy: .equal, toItem: profilePictureImageView, attribute: .right, multiplier: 1, constant: 16)])

    // right constraint
    addConstraints([NSLayoutConstraint(item: commentTextView, attribute: .right, relatedBy: .equal, toItem: self.commentTextView.superview, attribute: .right, multiplier: 1, constant: -16)])

    // height constraint
    addConstraints([NSLayoutConstraint(item: commentTextView, attribute: .height, relatedBy: .equal, toItem: self, attribute: .height, multiplier: 0.3, constant: 1)])

Ура, ребята!

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Первоначально ответил здесь .

Не изменяйте и не передавайте кадры вашему UITextView. Просто дайте ему ограничения leading, trailing, top & bottom. Тогда, если ваша ячейка может иметь автоматический размер, вам не нужно ничего вычислять для вашего текстового представления.

При использовании Auto-Layout для динамического определения размера ячеек вам не нужно реализовывать sizeThatFits(...). Если ограничения настроены правильно, вам нужно только отключить прокрутку UITextView.

Из кода:

yourTextView.scrollEnabled = false

Из IB:

Выберите текстовое представление и откройте Инспектор атрибутов , затем

enter image description here


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

0 голосов
/ 16 сентября 2018

Как уже упоминалось вчера, я заставил textview адаптировать свой размер на основе ответа @nayem - спасибо!

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

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    let dummyText = "Just a long text to see what will happen to the cell. Will it adapt or not? Let's find out!"

    let rectWidth = view.frame.width - 32 - 60 - 16

    let rect = NSString(string: dummyText).boundingRect(with:CGSize(width: rectWidth, height: 1000), options: NSStringDrawingOptions.usesFontLeading.union(NSStringDrawingOptions.usesLineFragmentOrigin), attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 16)], context: nil)

    let variableHeight = 16 + 20 + 2 + 20 + 2 + 16 + rect.height

    return CGSize(width: view.frame.width, height: variableHeight)

}

Это лучший способ сделать это?Это вызовет проблемы позже?

0 голосов
/ 14 сентября 2018

Вы могли бы рассмотреть другой способ о dynamic height из UITextView.Известно о внутреннем размере контента .Вы можете реализовать динамическую высоту с помощью этой технологии.

...