Ошибка рендеринга текста CoreText

Я работаю над новым приложением. Я отображаю различные документы из NSAttributedString, используя основной текст. У меня проблемы со странными глюками при рендеринге текста. Это происходит не с каждым документом. Кажется, нет рифмы или причины, когда оно появляется или нет.

Вот обрезанный снимок экрана, чтобы продемонстрировать проблему.

Сбой при рендеринге

Вот строка из того же скриншота, которая отображается правильно.

Правильный рендеринг

Снимки экрана взяты из одного и того же снимка экрана и из одного документа.

Когда возникает проблема, обычно неправильно отображаются только 2-3 последовательные строки текста. В остальном документ в порядке.

Вот код, который я использую для рендеринга текста в drawRect:

CGContextRef context = UIGraphicsGetCurrentContext();

float viewHeight = self.bounds.size.height;
CGContextTranslateCTM(context, 0, viewHeight);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextSetTextMatrix(context, CGAffineTransformMakeScale(1.0, 1.0));

CGMutablePathRef path = CGPathCreateMutable();
CGRect bounds = CGRectMake(PADDING_LEFT, -PADDING_TOP, self.bounds.size.width-20.0, self.bounds.size.height);
CGPathAddRect(path, NULL, bounds);

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFMutableAttributedStringRef)attrString);
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);
CFRelease(framesetter);
CFRelease(path);
CTFrameDraw(frame, context);

Любая помощь приветствуется!

EDIT: Эта проблема не существует на iPhone 4, только на 3GS, который у меня есть для тестирования.

Ошибка всегда в середине документа.


person jschmidt    schedule 01.06.2011    source источник


Ответы (1)


Пожалуйста, попробуйте различные настройки, чтобы повлиять на субпиксельный рендеринг текста. Вы можете увидеть различные параметры в строке 259 в https://github.com/Cocoanetics/NSAttributedString-Additions-for-HTML/blob/master/Classes/DTCoreTextLayoutFrame.m

person Cocoanetics    schedule 19.06.2011
comment
Спасибо за идею. Я попробую сегодня позже, надеюсь! - person jschmidt; 20.06.2011
comment
Спасибо за предложение, но я попробовал каждый из этих вариантов и все эти варианты вместе. Хотя они изменили способ отображения текста, ни один из них не решил проблему. - person jschmidt; 20.06.2011
comment
Это обычный drawRect или вы используете его в drawLayer CATiledLayer? Может быть, излом происходит в углу плитки? - person Cocoanetics; 20.06.2011
comment
Он находится в drawRect. Глюк всегда происходит где-то в середине текста. Это всего одна или две строки, а остальной текст выглядит нормально. Это также не происходит на iPhone 4. Я предполагаю, что дисплей Retina может повлиять на то, как отображается текст. Честно говоря, я думаю, что это может быть ошибка в iOS. - person jschmidt; 20.06.2011
comment
Можете ли вы попробовать мой проект с открытым исходным кодом github.com/Cocoanetics/NSAttributedString-Additions-for- HTML, если это происходит в тех же ситуациях? - person Cocoanetics; 20.06.2011
comment
Я много смотрел на ваш код. Очень интересный материал, но прямо сейчас над моей головой. В нем НЕТ тех же текстовых сбоев, что и в моем коде, но я не могу понять, почему. Ваш код намного сложнее, чем мне нужно, поэтому я не хочу добавлять его в свой проект. Я заметил, что вы используете drawInContext вместо того, чтобы помещать код в drawRect. Что является причиной этого? - person jschmidt; 11.07.2011
comment
drawInContext — это то, что на самом деле вызывается слоем UIView для рисования. Поместив туда этот код, он работает независимо от класса слоя, используемого UIView, то есть также CATiledLayer, который полезен для больших документов. - person Cocoanetics; 17.07.2011
comment
Спасибо за вашу помощь. Единственное, о чем я могу думать на данный момент, это о какой-то ошибке в CTFrameSetter/CTFrame. В вашем коде вы размещаете каждую строку отдельно, тогда как в моем я использую автоматическую компоновку. Я собираюсь сделать отчет об ошибке и посмотреть, куда это меня приведет. - person jschmidt; 18.07.2011
comment
не правда. Я компоную весь CTFrame за один раз. Но я РИСУЮ отдельные глифы сами по себе, потому что мне нужно сделать дополнительный рисунок для определенных вещей, таких как подчеркивание, зачеркивание и т. д. - person Cocoanetics; 18.07.2011
comment
Да, прости. Я исправляюсь. Однако я ничего не рисую индивидуально. Я позволил CT установить весь кадр самостоятельно. - person jschmidt; 18.07.2011
comment
Он был переименован в DTCoreText. - person Cocoanetics; 24.04.2013