Я работал над чем-то вроде этого.
Все работало нормально, пока я не обнаружил ввод строки, который вызывает проблему
Входная строка: «Это длинное titlessss\n Withssssssss».
По сути, кажется, что «длинное» слово вписывается в пробел, но по какой-то причине оно рисуется на следующей строке.
Когда я устанавливаю новый атрибутированный текст, я всегда обновляю textStorage таким образом.
textStorage.setAttributedString(attributedText)
Вызовы подкласса моего UILabel
layoutManager.enumerateLineFragments(forGlyphRange: range) { (_, usedRect, _, glyphRange, _) in
внутри drawText(in rect:)
Здесь glyphRange возвращает location 0 and length 15
для первых LineFragments (поэтому до long), а размер прямоугольника — это то, что вы видите на картинке, потому что именно его я использую для создания пути Безье.
Это настройки для всех объектов TextKit.
let textContainer = NSTextContainer()
textContainer.heightTracksTextView = true
textContainer.lineFragmentPadding = 0
let layoutManager = NSLayoutManager()
layoutManager.usesFontLeading = false
layoutManager.allowsNonContiguousLayout = true
translatesAutoresizingMaskIntoConstraints = false
backgroundColor = .clear
lineBreakMode = .byCharWrapping
textContainer.lineBreakMode = lineBreakMode
layoutManager.addTextContainer(textContainer)
textStorage.addLayoutManager(layoutManager)
isUserInteractionEnabled = true
Я пробовал все. Некоторые методы делегирования, перемещающие логику повсюду. Я не могу понять, почему эта строка рисуется в следующей строке.