Использование исключения текстового представления для представления внутри UITableViewCell в некоторых случаях не увеличивает высоту текстового представления, когда это необходимо - PullRequest
0 голосов
/ 07 мая 2020

У меня UITextView внутри UITableViewCell. Текстовое представление находится в виде вертикального стека, который содержит другое представление с постоянной высотой (в настоящее время скрыто). Представление стека прикрепляется к краям представления таблицы. Кроме того, ячейка содержит вид горизонтального стека с UILabel и UIImageView.

Теперь я пытаюсь заставить текст текстового представления плавать вокруг горизонтального представления стека. Вот код в подклассе табличного представления, где я получаю фрейм представления горизонтального стека, конвертирую его в систему координат текстового представления и вызываю метод, определенный в расширении UITextView (подробнее об этом позже):

override func layoutSubviews() {
    super.layoutSubviews()

    DispatchQueue.main.async {
        let frame = self.textView.convert(self.statusStackView.frame, from: self)
        self.textView.configureTextExclusion(for: frame)

    }
}

А вот методы в расширении UITextView (есть и другие для получения количества строк и установки вставки текста):

 extension UITextView {

func configureTextExclusion(for frame: CGRect) {
    textContainerInset = UIEdgeInsets(top: 0,
                                      left: 0,
                                      bottom: 0,
                                      right: numberOfLines() > 1 ? 0 : 1)
    setExclusionFrames([frame])
}

func setExclusionFrames(_ frames: [CGRect]) {
    var exclusionPaths = [UIBezierPath]()
    exclusionPaths = frames.map { UIBezierPath(rect: $0) }
    textContainer.exclusionPaths = exclusionPaths
    textContainer.lineBreakMode = .byTruncatingTail
}

func numberOfLines() -> Int {
    let layoutManager = self.layoutManager
    let numberOfGlyphs = layoutManager.numberOfGlyphs
    var lineRange: NSRange = NSMakeRange(0, 1)
    var index = 0
    var numberOfLines = 0

    while index < numberOfGlyphs {
        layoutManager.lineFragmentRect(
            forGlyphAt: index, effectiveRange: &lineRange
        )
        index = NSMaxRange(lineRange)
        numberOfLines += 1
    }
    return numberOfLines
  }
}

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

Я также пытался установить пути исключения для пустого массива в методе prepareForReuse(), но нет эффект.

enter image description here

...