CTFramesetter
не управляет списком CTFrame
, а сами кадры являются неизменяемыми.
Ответственность за управление кадрами лежит на нас, поэтому, если есть какие-либо изменения в текстовом источнике, ie. Приписанная строка, мы должны заново сгенерировать все кадры с начала, потому что это единственный способ прогрессирования фрейм-установщика - нет режима обратного продвижения. К счастью, этот процесс оказался быстрым и может быть выполнен в фоновом потоке.
В том случае, если просто необходимо иметь рамку (например, закадровый рисунок и т. Д. c.) Для диапазона текста, предшествующего текущей позиции. (если, например, из текущей позиции нарисовано на экране), этот кадр может быть создан с использованием, например, следующего расширения
extension CTFramesetter {
func prevFrame(position: Int) -> CTFrame {
let size = CTFramesetterSuggestFrameSizeWithConstraints(self,
CFRange(location: 0, length: position), nil,
CGSize(width: UIScreen.main.bounds.width, height: CGFloat.greatestFiniteMagnitude), nil)
let path = CGPath(rect: CGRect(origin: .zero, size: size), transform: nil)
return CTFramesetterCreateFrame(self, CFRangeMake(0, position), path, nil)
}
}
, конечно, оно не является обобщенным c, поскольку пути расположения могут отличаться, и атрибуты могут отличаться, но для упрощенных условий, предусмотренных в начальном вопросе topi c, его можно использовать.