Зачем использовать макет текста CoreText для рендеринга, текст может отображаться в пути шириной 1 пиксель?

Я написал код, использующий макет CoreText для некоторых текстов, как на картинке ниже. Красный прямоугольник — это текстовая область, черный прямоугольник пуст для изображений или других объектов. Я использую kCTFrameClippingPathsAttributeName, чтобы сообщить CoreText, что черный прямоугольник не будет отображать тексты.

макет основного текста

Подробное изображение, как показано ниже:

введите здесь описание изображения

Почему текст разрывается в этой позиции? Красный прямоугольник и черный прямоугольник имеют очень маленькую площадь, размер всего 1 пиксель в ширину, почему текст выходит?

Правая красная прямоугольная рамка — (533, 40, 440, 668), правая маленькая прямоугольная рамка — (534, 98, 440, 399).

такой код:

CGPathRef textArea; 

// An array of clipping paths
NSMutableArray * clippingPaths = [NSMutableArray array];
for (TNPageMedium *medium in self.media) {
    NSDictionary *clippingPathDict = @{(NSString *)kCTFramePathClippingPathAttributeName:(__bridge id)path};
    [clippingPaths addObject:clippingPathDict];
}

NSDictionary  *optionsDict = @{(NSString*)kCTFrameClippingPathsAttributeName : clippingPaths};

// create frame using texAreaPath, an optionDictionary contains clipping paths
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(pos, 0), textAreaPath, (__bridge CFDictionaryRef)(optionsDict));

// Draw Frame
CTFrameDraw(frame, context);

person Tinyfool    schedule 26.11.2012    source источник


Ответы (1)


Похоже, в вашем attributedString отсутствует информация о стиле абзаца.

Я предполагаю, что вы создали NSAttributedString из NSString и не указали ключ-значение kCTParagraphStyleAttributeName в словаре атрибутов.

person sycx    schedule 26.11.2012
comment
Следует ли использовать все CTParagraphStyleSpecifiers в CTParagraphStyleSetting? - person Dennis Pashkov; 06.03.2013