2011-06-16 79 views
9

的属性串只有一个属性的多语言布局 - 17点Helvetica字体NeueUI - 覆盖整个字符串。 1〜3行纯英文,4〜6行是英文和中文混合,7〜8行纯中文。行距与核心文本

然后将其用CTFramesetter和所得帧layouted画有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中的行空格是统一的,包括两个中文行之间的最后一行。

Screenshot

注意:这上面的结果是得到了一个真正的设备上。如果你在模拟器上运行相同的代码,核心文本视图会得到非常不同的结果 - 包含中文的行之间的空间比其他空间大得多。

  1. 为什么中国线之间的距离较小(较大)?
  2. 如何使用核心文本来布置具有统一线高度的多语言文本?

PS:这里是sample project你可以尝试自己。

回答

1

我终于得到来自苹果工程师的官方回答:

CTLine度量是基于最大的每{上升,下降, 领先}的;这并没有改变,也没有改变。客户端可能会覆盖使用的段落样式说明符或iOS 7文本样式, 例如 行的度量[UIFont preferredFontForTextStyle:UIFontTextStyleBody]。

+0

如果您不介意,我很乐意在开发人员论坛上看到您的iOS 5答案(直到您可以在此发布)。 – 2011-09-26 02:03:40

+0

等待OP交付。 – mxcl 2011-12-20 00:31:03

3

与欧洲语言中的每个字母之间的空格类似,中文写作在字符之间使用狭窄的空间,但除了在极少数情况下,它并没有观察到与单词之间的更宽的空间等价。 (在这方面,它可能有点类似于scriptio连续的形式。) 当使用空间时,它也是全宽。其使用的一个例子是作为一种荣誉标志。台湾现代的一个例子是,在蒋介石作为先总统蒋公(蒋介石前总统)时提到,前一个空间是蒋公的一个荣誉标志。这种用法在非常正式的信件或其他旧式文件中仍然是最新的。 当汉语写成音译形式时(如汉语拼音),空格用于帮助阅读。出处:http://en.wikipedia.org/wiki/Chinese_punctuation

因此,它因为在中国的空间用于有点不同于英语。

1

的原因空间取决于角色,因为它可以查询文本其尺寸的部件时发现,但这并不表明为什么一个标签,简单地忽略了这个问题。

但是,实际上由FrameSetter引入的空间为了实现均匀空间,您可以使用FrameSetter获取换行符并使用TypeSetter(CTTypesetterCreateWithAttributedString)生成行并将它们指向所需的行距,如Manual Line Break from Apple所示。这也适用于您的样品,因为我已经简要检查过。

无论如何,我只能同意标签的行为有点奇怪,但不是这么糟糕,因为它看起来更好。