2011-06-16 62 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所示。這也適用於您的樣品,因爲我已經簡要檢查過。

無論如何,我只能同意標籤的行爲有點奇怪,但不是這麼糟糕,因爲它看起來更好。