国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何使用Cocoa文字系統

移動開發 iOS
Cocoa文字系統是一組類,NSTextView、NSTextField和NSStringDrawing都會用它們在屏幕上顯示字符。如果你閱讀過蘋果的文檔,可能你會被嚇到,因為蘋果的文檔寫的非常復雜,包括了非常多的類。

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

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

Cocoa文字系統

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

蘋果其實已經在Drawing Text with NSLayoutManager這篇文檔中提供了一個很好的關于如何顯示文字的介紹。

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

你可以像通常一樣使用+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]; 

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

如果想在文字中添加特殊風格或者圖片,也很簡單,因為NSTextStorage是NSMutableAttibutedString的子類,所以指定風格、字體都很容易。

測量文字

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

  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文字系統

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

  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文字系統不僅僅比ATSUI簡單,而且它的設計非常類似CoreText。因此如果你希望在你的軟件未來的某個版本中使用CoreText,你可以現在就用這種方式顯示文字,那么將來的轉換會非常方便。

小結:關于如何使用Cocoa文字系統的內容介紹完了,希望通過本文的學習對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

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 內存

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開發CocoaXML

2011-07-07 13:39:14

Cocoa 框架

2011-07-07 13:30:32

Cocoa Core

2011-07-07 14:22:27

Cocoa 對象 生命周期

2011-07-07 13:59:49

Cocoa Objective- 根類

2011-07-28 17:46:54

IOS Cocoa 用戶界面

2011-07-20 09:49:41

Xcode Interface Builder

2011-06-17 16:23:49

Cocoa蘋果

2011-08-10 18:47:18

Cocoa字符串

2011-07-26 10:42:00

Cocoa Cocoa2d 游戲

2011-07-08 16:43:46

iPhone Cocoa 多線程
點贊
收藏

51CTO技術棧公眾號

中文字幕的久久| 亚洲精品美女久久久久| 国产成人a视频高清在线观看 | 香港成人在线视频| 亚洲综合社区| 影视一区二区三区| av不卡在线免费观看| 最近2019中文免费高清视频观看www99| 午夜精品久久久久久| 欧洲人成人精品| 国内伊人久久久久久网站视频 | 欧洲精品一区二区三区久久| 久久精品精品电影网| 国产精品伦一区二区三级视频| 51社区在线成人免费视频| 最新天堂资源在线资源| 国产精品无码一区二区在线| 国产日韩视频在线观看| www.色偷偷.com| 欧美巨大黑人极品精男| 91精品国产入口| 国产精品国产亚洲伊人久久| 欧美又粗又大又爽| 精品视频中文字幕| 久久精品久久久久| 狠狠躁夜夜躁人人爽超碰91| 国产精选一区二区三区| 日韩一级完整毛片| 日韩av卡一卡二| 久久久久久九九九九| 国产剧情在线观看一区| 欧美伊人久久久久久久久影院| 亚洲淫片在线视频| 激情乱色小说视频| 日韩电影免费在线| 久久久亚洲国产| sm一区二区三区| 精品视频高清无人区区二区三区| 看av免费毛片手机播放| 亚洲成人一区在线观看| 美女在线一区二区| 欧美激情第三页| 中文字幕久久亚洲| 999视频在线免费观看| 亚洲男人的天堂在线| 欧美日韩精品一区二区三区 | 久久国产精品第一页| 国产农村妇女精品一区二区 | 26uuu精品一区二区三区四区在线| 日韩制服丝袜先锋影音| 中文av一区| 丝袜亚洲另类丝袜在线| 日韩一级精品视频在线观看| 欧美精品 国产精品| 中文字幕综合网| 午夜久久久久久久久久一区二区| 色拍拍在线精品视频8848| 91精品国产九九九久久久亚洲| 68精品国产免费久久久久久婷婷| 男女激烈动态图| 香蕉视频亚洲一级| 亚洲欧美一区在线| 北条麻妃在线| 秋霞电影网一区二区| 日韩av一二三| 成人在线一区二区| 欧美日韩你懂的| 热草久综合在线| 男人捅女人免费视频| 日本久久久精品视频| 欧美日韩高清一区| 欧美在线视频在线播放完整版免费观看| 色婷婷综合久久久久中文字幕1| 九九九久久久久久| 欧美三级理论片| 激情视频免费观看在线| 亚洲黄色三级| 成人黄色一级视频| 国产精品久久网站| 菠萝蜜影院一区二区免费| 成人片在线播放| 99视频精品| 狠狠色狠狠色合久久伊人| 国产精品伦理一区二区| 日韩欧美亚洲日产国| 777精品久无码人妻蜜桃| 一个色免费成人影院| 99成人精品| 久久99国内精品| 亚洲国产精品成人综合| 天天爱天天做天天操| 中文字幕国产在线| 欧美肥老太太性生活| 激情六月丁香| 青青一区二区| 欧美黄色性生活| 韩国av一区二区三区| 91久久国产精品91久久性色| 欧美日韩精品在线播放| 欧美96在线| 亚洲精品天堂成人片av在线播放| 日韩中文有码在线视频| 亚洲日本青草视频在线怡红院 | 国产深夜视频在线观看| 亚洲熟妇无码一区二区三区| 久久亚洲一级片| 国产91丝袜在线18| 成人激情黄色小说| 久久国产日韩欧美精品| 91成人性视频| 亚洲丁香婷深爱综合| 欧美视频中文字幕在线| 999在线精品| 97公开免费视频| 国内精品伊人久久| 亚洲品质自拍视频网站| 日本成人黄色网址| 蜜桃久久av| 欧美日韩免费高清| 欧美激情综合| 成人性生活视频免费看| 日韩av在线免费观看不卡| 精品女同一区二区三区在线播放| 毛片av在线播放| 欧美美女网站色| 欧美卡一卡二| 成人福利免费在线观看| 中文字幕无线精品亚洲乱码一区| 午夜久久影院| 粉嫩精品一区二区三区在线观看| 五月精品视频| 国产精品天天狠天天看| 免费成人蒂法| 国产精品综合不卡av| 国产精品久久久久av福利动漫| 色妞ww精品视频7777| 中文字幕精品国产| 欧美色爱综合| 亚洲精品乱码久久久久久自慰| 成+人+亚洲+综合天堂| 狠狠热免费视频| 在线视频日韩精品| 男人在线资源站| 精品国产综合久久| 日韩中文字幕av电影| 黄色av网址在线播放| 一区二区三区中文字幕精品精品 | 国产精品不卡在线| 久久久久久久片| 欧美第一淫aaasss性| 欧美日韩麻豆| 91精品久久香蕉国产线看观看| 久久久久一区| 欧美精品久久96人妻无码| 91影院在线观看| 嫩草在线播放| 91精品美女在线| 国产亚洲精品91在线| 亚洲午夜日本在线观看| 久久精品av麻豆的观看方式| 亚洲aa在线| 无遮挡爽大片在线观看视频| 欧美成人影院在线播放| 黄色影视在线观看| 国产精品免费在线免费| 亚洲人成自拍网站| 91黄色免费看| 国产精品短视频| 成年网站在线视频网站| 久99久在线视频| 中文字幕一区二区5566日韩| 成人性爱视频在线观看| 日韩成人av在线| 97久久夜色精品国产| 免费日韩av电影| 国产精品电影一区二区三区| 久久亚洲专区| 久久综合国产| 国产一区二区三区不卡在线观看| 亚洲最大福利视频网| 久久黄色影视| 国产精品果冻传媒潘| 国产精品一区二区黑丝| 亚欧激情乱码久久久久久久久| 婷婷亚洲久悠悠色悠在线播放| 免费动漫网站在线观看| 欧美性大战久久久| 成人日韩在线观看| 酒色婷婷桃色成人免费av网| 国产精品久久久久久久一区探花| 成人在线综合网站| 簧片在线观看| 色妹子一区二区| 久久久久毛片免费观看| 51精品国产人成在线观看 | 中文字幕一区二区精品| 亚洲三级精品| 色999五月色| 日av在线播放中文不卡| 亚洲一区二区三区高清不卡|