У меня 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()
, но нет эффект.