LayoutManager.glyphRange возвращает полный диапазон глифов, хотя textContainer имеет ширину только 1.IOS

Программируем под IOS
Ответить
Anonymous
 LayoutManager.glyphRange возвращает полный диапазон глифов, хотя textContainer имеет ширину только 1.

Сообщение Anonymous »

Я хочу определить «объем» текста, который помещается в данный текстовый контейнер/ограничивающую рамку.
Однако, независимо от того, как я настраиваю свой текстовый контейнер, я всегда получаю возвращаемые все глифы/символы. Это мой тестовый код игровой площадки:

Код: Выделить всё

import UIKit

let height = 30
let width = 50
let text = "Dame Henrietta Barnett (1851-1936) was a social reformer and philanthropist known for her significant contributions to improving the lives of the urban poor in London during the late 19th and early 20th centuries. She is best known as the founder of Hampstead Garden Suburb, a pioneering model of urban planning that aimed to create a harmonious blend of town and country living."

let size = CGSize(width: width, height: height)
let textContainer = NSTextContainer(size: size)
textContainer.lineFragmentPadding = 0
textContainer.lineBreakMode = .byClipping

let layoutManager = NSLayoutManager()
layoutManager.addTextContainer(textContainer)

let font = UIFont.systemFont(ofSize: 18)
let attributes: [NSAttributedString.Key: Any] = [
.font: font,
]

let textStorage = NSTextStorage(string: text, attributes: attributes)
textStorage.addLayoutManager(layoutManager)

let glyphRange = layoutManager.glyphRange(for: textContainer)
let characterRange = layoutManager.glyphRange(forBoundingRect: CGRect(x: 0, y: 0, width: 1, height: 1), in: textContainer)
let visibleText = (text as NSString).substring(with: characterRange)
NSLog("Visible text: \(visibleText)")
Значение «visibleText» — это полный текст.
Если я укажу ширину/высоту 0, диапазон будет равен 0, что делает смысл.
Примечание: я знаю, что с шириной и высотой он, вероятно, не должен возвращать какой-либо диапазон, я не понимаю, почему он это делает (указывая любой другой диапазон, например, w: 100, height: 40, также возвращает полный текст)
Я также пробовал использовать

Код: Выделить всё

let characterRange = layoutManager.characterRange(forGlyphRange: glyphRange, actualGlyphRange: nil)
но здесь та же проблема.
используется версия Xcode: 16.0 beta 2

Подробнее здесь: https://stackoverflow.com/questions/786 ... er-only-ha
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»