自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何使用Cocoa文字系統(tǒng)

移動開發(fā) iOS
Cocoa文字系統(tǒng)是一組類,NSTextView、NSTextField和NSStringDrawing都會用它們在屏幕上顯示字符。如果你閱讀過蘋果的文檔,可能你會被嚇到,因?yàn)樘O果的文檔寫的非常復(fù)雜,包括了非常多的類。

本文主要來介紹如何使用Cocoa文字系統(tǒng),在某些情況下你可能需要對想顯示在屏幕上的文字做更多的控制,而不是僅僅使用NSTextField或者NSTextView,有時候你需要更高效地在屏幕上畫文字,而不想使用NSStringDrawing方法。還可能你需要在CGContext上畫文字,再有可能你想在一個Carbon程序中畫文字。

這個時候,你就可能會考慮CoreText了,不過你還可能想兼容Mac OS X 10.4。這里又一個簡單的方法可以滿足你全部的需要。

Cocoa文字系統(tǒng)

這個辦法就是使用Cocoa文字系統(tǒng)。Cocoa文字系統(tǒng)是一組類,NSTextView、NSTextField和NSStringDrawing都會用它們在屏幕上顯示字符。如果你閱讀過蘋果的文檔,可能你會被嚇到,因?yàn)樘O果的文檔寫的非常復(fù)雜,包括了非常多的類,諸如:NSLayoutManagers, NSTextStorages, NSTextContainers, NSGlyphGenerators, NSTypesetters…不過別怕,實(shí)際使用起來還是挺簡單的。

蘋果其實(shí)已經(jīng)在Drawing Text with NSLayoutManager這篇文檔中提供了一個很好的關(guān)于如何顯示文字的介紹。

如果你讀過上面的文檔,你可能會發(fā)現(xiàn),你實(shí)際上僅僅需要使用三個類就可以在屏幕上顯示任何帶有效果的Unicode字符串,這些字符串包含在一個由NSLayoutManager控制的方框內(nèi)。你希望顯示的文字和文字的屬性保存在NSTextStorage中,需要顯示的位置是由NSTextContainer指定的。另外,如果你創(chuàng)建了這些對象,你還可以將它們緩存,這樣可以明顯加快顯示速度。

你可以像通常一樣使用+alloc/-init方法建立這些對象,然后告訴layout manager保管這些文字的外觀,告訴text storage保管layout manager。蘋果的例子大概是這樣的:

  1. NSTextStorage *textStorage = [[NSTextStorage alloc] initWithString:@"This is the text string."];  
  2. NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];  
  3. NSTextContainer *textContainer = [[NSTextContainer alloc] init];  
  4. [layoutManager addTextContainer:textContainer];  
  5. [textContainer release];  
  6. [textStorage addLayoutManager:layoutManager];  
  7. [layoutManager release];  
  8. // Use the objects.  
  9. [textStorage release]; 

想在屏幕上顯示這個字符串的話,你可以指定顯示的位置,然后告訴layout manager使用drawGlyphsForGlyphRange在屏幕的特定位置顯示。

  1. [textContainer setContainerSize: rect.size];  
  2. NSRange glyphRange = [layoutManager glyphRangeForTextContainer: textContainer];  
  3. [layoutManager drawGlyphsForGlyphRange: glyphRange atPoint: rect.origin]; 

還是很簡單的,對吧?有兩件事情需要注意:當(dāng)你改變文字容器的尺寸時,文字需要重新排列和折行,這些操作可以通過緩存來加速。另外,你可以直接調(diào)用glyphRangeForTextContainer:方法來手動控制文字重排。

如果想在文字中添加特殊風(fēng)格或者圖片,也很簡單,因?yàn)镹STextStorage是NSMutableAttibutedString的子類,所以指定風(fēng)格、字體都很容易。

測量文字

比如你希望測量一段文字要占屏幕多大位置,可以先將文字容器的一個屬性:寬或者高設(shè)置成一個定值,然后將另外一個屬性設(shè)置成一個很大的數(shù)值,比如FLT_MAX,然后調(diào)用-glyphRangeForTextContainer:方法重排文字,然后就可以通過-usedRectForTextContainer:方法獲取到這段文字實(shí)際需要占多大的屏幕空間了:

  1. [textContainer setContainerSize: NSMakeSize([self bounds].size.width, FLT_MAX)];  
  2. (NSRange) [layoutManager glyphRangeForTextContainer: textContainer]; // Cause re-layout.  
  3. NSRect neededBox = [layoutManager usedRectForTextContainer: textContainer]; 

在Quartz或Carbon中使用Cocoa文字系統(tǒng)

Carbon直接使用Quartz的API。另外,在OpenGL材質(zhì)中、PDF中和其他特殊地方顯示文字也都直接使用Quartz。那么,如何才能在Quartz中使用上面所說的方法呢?你無法獲取到NSGraphicsContext,你只有CGContext,怎么辦呢?其實(shí)不難,NSGraphicsContext中都帶有一個CGContext,而且可以互相轉(zhuǎn)換。這樣,比如你獲取到一個叫做inContext的CGContextRef變量,你可以用下面的方法實(shí)現(xiàn)文字顯示:

  1. [NSGraphicsContext saveGraphicsState];  
  2. NSGraphicsContext   
  3. context = [NSGraphicsContext graphicsContextWithGraphicsPort: inContext flipped: true];   
  4. [NSGraphicsContext setCurrentContext: context];  
  5. // Do Cocoa drawing here.  
  6. [NSGraphicsContext restoreGraphicsState]; 

這樣做的好處是Cocoa文字系統(tǒng)不僅僅比ATSUI簡單,而且它的設(shè)計非常類似CoreText。因此如果你希望在你的軟件未來的某個版本中使用CoreText,你可以現(xiàn)在就用這種方式顯示文字,那么將來的轉(zhuǎn)換會非常方便。

小結(jié):關(guān)于如何使用Cocoa文字系統(tǒng)的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)對你有所幫助!

責(zé)任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-08-15 14:27:51

CocoaRunLoop

2011-07-07 13:51:24

Cocoa 框架

2011-07-06 15:06:46

Xcode Cocoa

2011-05-11 17:48:31

CocoaiOS

2011-08-11 15:46:55

CocoaCocoa Touch框架

2011-07-28 11:12:25

Cocoa 內(nèi)存

2011-07-20 14:46:59

Cocoa XML 文件

2011-08-10 18:37:32

CocoaMac OS X

2011-05-11 15:27:58

Windows OOPCocoa MVCCocoa

2011-08-15 15:26:20

iPhone開發(fā)CocoaXML

2011-07-07 13:39:14

Cocoa 框架

2011-07-07 13:30:32

Cocoa Core

2011-07-28 17:46:54

IOS Cocoa 用戶界面

2011-07-07 14:22:27

Cocoa 對象 生命周期

2011-07-07 13:59:49

Cocoa Objective- 根類

2011-07-20 09:49:41

Xcode Interface Builder

2011-06-17 16:23:49

Cocoa蘋果

2011-08-10 18:47:18

Cocoa字符串

2011-06-27 15:39:51

Cocoa Touch

2011-07-26 10:42:00

Cocoa Cocoa2d 游戲
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號