CTFramesetterSuggestFrameSizeWithConstraints при переносе текста

Я испытываю проблемы типа «курица или яйцо» с CoreText.

Мне нужно знать, что CGSize и NSAttributedString займут место, когда они обернуты вокруг изображения. У меня есть UITableView, который отображает текст и изображение в правом верхнем углу. В моей модели я храню CTFrameSetterRef, т.е. я вычисляю это один раз для всех объектов моей модели, когда они загружаются, а затем передаю свою ячейку CTFrameSetterRef в cellForRowAtIndexPath.

Я также предварительно вычисляю высоту ячейки с помощью моего frameSetter и CTFramesetterSuggestFrameSizeWithConstraints. Это прямолинейно, теперь у меня есть массив объектов, у которых есть AttributedString для рендеринга, frameSetter для их рендеринга и высота, поэтому tableView знает это раньше обновление ячейки.

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

Насколько я могу понять, мне нужен CTFrameSetter для расчета размера (используя CTFramesetterSuggestFrameSizeWithConstraints). Это дает мне размер только в том случае, если мой фрейм прямоугольный. Если я хочу обернуть текст, мне нужно создать путь и установить его размер, но это до того, как я узнаю размер! Затем мне нужно добавить путь к словарю и создать CTFrameRef со словарем.

Мой вопрос: как мне предварительно рассчитать высоту для моей ячейки, если мой атрибутированный текст обернут вокруг изображения?


person RickiG    schedule 05.02.2012    source источник


Ответы (1)


Вам нужно расположить строку за строкой:

  1. Разместите первую строку с ограничением ширины и получите высоту строки и fitRange, используя CTFramesetterSuggestFrameSizeWithConstraints.
  2. Разместите вторую строку ниже первой с правильным ограничением ширины — из высоты предыдущих строк и желаемого интервала вы можете вычислить origin.y текущей строки, который вы используете, чтобы выяснить, будет ли эта строка работать против изображение, продолжающееся в конце последнего fitRange.
  3. Go on…
person an0    schedule 23.04.2012