Атрибутивная строка имеет только один атрибут - 17-точечный шрифт Helvetica NeueUI - охватывающий всю строку Строки 1 ~ 3 - чисто английские, строки 4 ~ 6 - смеси английского и китайского, строки 7 ~ 8 - чисто китайские.
Затем он размещается с помощью CTFramesetter, а результирующий кадр рисуется с помощью CTFrameDraw.
// UIView subclass
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor whiteColor];
CTFontRef font = CTFontCreateWithName(CFSTR("Helvetica NeueUI"), 17.f, NULL);
_text = [[NSAttributedString alloc] initWithString:string attributes:
[NSDictionary dictionaryWithObject:(id)font forKey:(id)kCTFontAttributeName]];
CFRelease(font);
_framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)_text);
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, self.bounds);
_frame = CTFramesetterCreateFrame(_framesetter, CFRangeMake(0, 0), path, NULL);
CGPathRelease(path);
}
return self;
}
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
// Flip the coordinate system.
CGContextTranslateCTM(context, 0.f, self.bounds.size.height);
CGContextScaleCTM(context, 1.f, -1.f);
CGContextSetTextMatrix(context, CGAffineTransformIdentity);
CTFrameDraw(_frame, context);
CGContextRestoreGState(context);
}
Проблема в том, что расстояние между строками 7 и 8 (чисто китайские) намного меньше, чем у других.
Для контраста я поставил UILabel
под ним, с тем же шрифтом и текстом. Игнорируя разницу в рендеринге отдельных символов, вы можете видеть одинаковые пробелы в UILabel
, включая последнюю строку между двумя китайскими строками.
Примечание : приведенные выше результаты получены на реальном устройстве. Если вы запустите тот же код на симуляторе, вы получите совсем другой результат для представления Core Text - пробелы между строками, содержащими китайский, намного больше, чем другие.
- Почему расстояние между китайскими строками меньше (больше)?
- Как я могу расположить многоязычный текст с одинаковой высотой строки, используя Core Text?
PS: вот пример проекта , который вы можете попробовать сами.