随处使用Cocoa文字系统

随处使用Cocoa文字系统,第1张

概述随处使用Cocoa文字系统 在某些情况下 你可能需要对想显示在屏幕上的文字做更多的控制,而不是仅仅使用NSTextField或者NSTextView,有时候你需要更高效地在屏幕上画文字,而不想使用NSStringDrawing方法。还可能你 在某些情况下你可能需要对想显示在屏幕上的文字做更多的控制,而不是仅仅使用NSTextField或者NSTextView,有时候你需要更高效地在屏幕上画文字,而 随处使用Cocoa文字系统


在某些情况下 你可能需要对想显示在屏幕上的文字做更多的控制,而不是仅仅使用NSTextFIEld或者NSTextVIEw,有时候你需要更高效地在屏幕上画文字,而不想使用NsstringDrawing方法。还可能你

在某些情况下你可能需要对想显示在屏幕上的文字做更多的控制,而不是仅仅使用NSTextFIEld或者NSTextVIEw,有时候你需要更高效地在屏幕上画文字,而不想使用NsstringDrawing方法。还可能你需要在CGContext上画文字,再有可能你想在一个Carbon程序中画文字。

 

这个时候,你就可能会考虑CoreText了,不过你还可能想兼容Mac OS X 10.4。这里又一个简单的方法可以满足你全部的需要。

原文作者:Uli Kusterer

原文地址:http://www.zathras.de/angelweb/blog-cocoa-text-system-everywhere.htm

 

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。苹果的例子大概是这样的:

 

NSTextStorage *textStorage = [[NSTextStorage allocinitWithString:@"This is the text string."];

NSLayoutManager *layoutManager = [[NSLayoutManagerinit NSTextContainer *textContainer = [[NSTextContainer [layoutManager addTextContainer:textContainer];

[textContainer release];

[textStorage addLayoutManager:layoutManager];

// Use the objects.

release];

 

想在屏幕上显示这个字符串的话,你可以指定显示的位置,然后告诉layout manager使用drawGlyphsForGlyphRange在屏幕的特定位置显示。

setContainerSize: rect.size];

NSRange glyphRange = [layoutManager glyphRangeForTextContainer: textContainer];

drawGlyphsForGlyphRange: glyphRange atPoint: rect.origin];

还是很简单的,对吧?有两件事情需要注意:当你改变文字容器的尺寸时,文字需要重新排列和折行,这些 *** 作可以通过缓存来加速。另外,你可以直接调用glyphRangeForTextContainer:方法来手动控制文字重排。

如果想在文字中添加特殊风格或者图片,也很简单,因为NSTextStorage是NSMutableAttibutedString的子类,所以指定风格、字体都很容易。

测量文字

比如你希望测量一段文字要占屏幕多大位置,可以先将文字容器的一个属性:宽或者高设置成一个定值,然后将另外一个属性设置成一个很大的数值,比如FLT_MAX,然后调用-glyphRangeForTextContainer:方法重排文字,然后就可以通过-usedRectForTextContainer:方法获取到这段文字实际需要占多大的屏幕空间了:

[textContainer setContainerSizeNSMakeSize([self bounds].size.wIDthFLT_MAX)];

(NSRange) [layoutManager glyphRangeForTextContainer: textContainer]; // Cause re-layout.

NSRect neededBox = [layoutManager usedRectForTextContainer: textContainer];

在Quartz或Carbon中使用Cocoa文字系统

Carbon直接使用Quartz的API。另外,在OpenGL材质中、pdf中和其他特殊地方显示文字也都直接使用Quartz。那么,如何才能在Quartz中使用上面所说的方法呢?你无法获取到NSGraphicsContext,你只有CGContext,怎么办呢?其实不难,NSGraphicsContext中都带有一个CGContext,而且可以互相转换。这样,比如你获取到一个叫做inContext的CGContextRef变量,你可以用下面的方法实现文字显示:

[NSGraphicsContext saveGraphicsstate NSGraphicsContext

* context = [NSGraphicsContext graphicsContextWithGraphicsPort: inContext flippedtrue];

 setCurrentContext: context];

// Do Cocoa drawing here.

 restoreGraphicsstate这样做的好处是Cocoa文字系统不仅仅比ATSUI简单,而且它的设计非常类似CoreText。因此如果你希望在你的软件未来的某个版本中使用CoreText,你可以现在就用这种方式显示文字,那么将来的转换会非常方便。

总结

以上是内存溢出为你收集整理的随处使用Cocoa文字系统全部内容,希望文章能够帮你解决随处使用Cocoa文字系统所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1065629.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-26
下一篇2022-05-26

发表评论

登录后才能评论

评论列表(0条)

    保存