http://blog.csdn.net/kmyhy/article/details/7258338
本章描述Quartz对文本的基本支持,以及如何在应用程序中使用Quartz2d显示文本。 Quartz 2D 提供了基本的、低级别的绘制文字及符号的接口(使用MacRoman文本编码)。Quartz 2D提供与字体相关的API,可参考CGFont Reference 。
如果你要在iOS上开发一个基于文本的应用程序,首先参考iOS的Text,Web,andEditing编程指南,它描述了iOS对文本的支持。此外,UIKit提供了易于使用的满足一般应用的类:
UILabel类:绘制1行或多行静态文本,你可以用于标注不同的UI部分。基本的UILabel提供了对显示文本的控制,包括是否有阴影或高亮。如有必要,你可以通过子类化定制文本的显示。 UITextFIEld 类是为从用户搜集少量文本和一些实时动作而设计的。包括输入搜索文本。 UITextVIEw类支持特定字体、颜色和对齐方式的文本显示,也支持文本的编辑。尤其用于显示多行文本,比如大文本的显示。 UIFont类提供了字体选择和设置的接口。 UIKit扩展了Nsstring类用于在当前上下文计算和绘制文本。更多信息参考Nsstring UIKit增强指南。
如果你正在MacOS X上开发基于文本的应用程序,首先请参考Cocoa文本系统,见文档 Cocoa Text Architecture GuIDe. Cocoa 提供了完全的Unicode 支持,文本输入及编辑,精确的文本布局及类型设置,字体管理,以及其他高级文本处理特性。
iOS 3.2 以上及 Mac OS X 都支持Core Text,一种优秀的显示文本和处理字体的底层技术。Core Text 是为高性能设计的,易于使用,允许你在图形上下文中直接绘制unicode字符。如果你正在编写需要精确控制文本显示的应用,请参考Core Text Programming GuIDe.
如果你仅仅需要使用Quartz 2D提供的最基本的特性在图形上下文中绘制MacRoman字符,请参考本章。
Quartz 2D 如何绘制文本
Quartz 2D 使用字体绘制文本。字体是与字符关联的图形形象的集合。一个字符代表一个抽象意义,如,小写字母B,数字2,“+”号等。你在显示设备上看到的并不是字符本身,而是一个符号,一个路径,是字符的可视化表现。一个符号代表一个字符,例如字母b,多个字符如”fi”;还有不可见字符,如空格。Quartz用ATS框架(Appletype services)提供的字体数据来呈现符号。
字符编码是指将一个字符以某种编码方式映射为一个byte的二进制形式。例如,用ASCII编码用数字65代表大写字母A。当你想打印或显示文本时,你一般是通过字符而不是符号进行的。
你以用户空间坐标来指定文本的位置。文本矩阵规定了由文本空间到用户空间的转换方式。文本位置在文本矩阵的tx和ty变量中存储。当你创建图像上下文时,它以指定的矩阵初始化文本矩阵,文本空间坐标被初始化为用户空间坐标。
Quartz简单地将文本矩阵和当前转换矩阵和其他图形状态参数连接起来,以产生最终的文本渲染矩阵,正是用该矩阵将文本绘制在页上。文本矩阵只存在于文本控件,并不包含字体大小。
Quartz绘制文本时,从ATS中检索对应的符号并用当前图形参数绘制文本,例如填充色(如果文字是实心的)以及描边色。绘制之后,文本位置保留在最后绘制的点处。
控制文本外观
某些图形状态既用于绘制路径也用于文本。如描边色和填充色。(影响文本显示的其他属性和 *** 作请参考“Paths”).
有几种文本绘制属性只应用于文本。用表16-1中的函数设置这些值。注意,CGContextSelectFont函数可以设置字体以及字体大小、文字编码。“绘制文本”讨论了CGContextSelectFone和 CGContextSetFont之间的区别。
table 16-1 文本属性和设置它们的函数 | ||
属性 | 函数 | 说明 |
Font | CGContextSetFont CGContextSelectFont | Typeface. |
Font size | CGContextSetFontSize CGContextSelectFont | 大小(以文本空间单位) |
Character spacing | CGContextSetCharacterSpacing | 字间距(文本空间单位) |
Text drawing mode | CGContextSetTextDrawingMode | 每个符号的绘制方式。参考 Table 16-2 |
Text matrix | CGContextSetTextMatrix | 从文本空间到用户控件的转换矩阵 |
Text position | CGContextSetTextposition | 文本绘制位置 |
文本矩阵类似当前转换矩阵(CTM),但只用于文本。你可以用任何仿射转换函数对文本矩阵进行复杂的转换。当绘制文本时,quartz使用你指定的文本矩阵。当绘制其他东西时,Quartz使用CTM而不是文本矩阵。
Drawing Text
用Quartz绘制文本需要经过以下步骤:
设置字体及字体大小 设置绘制模式 设置其他——描边色、填充色、背景区域 如果需要变换,需要设置文本矩阵、旋转、缩放值 绘制
Quartz 2D有两种方法设置字体及大小。CGContextSelectFont或CGContextSetFont+CGContextSetFontSize。CGContextSElectFont更简单一些。CGContextSetFont和CGContectSetFontSize麻烦一些,但你也可能想用Cocoa来设置字体然后进行绘制。因为Quartz在绘制文本上有一些限制。让我们再来比较一下两种方法的区别。
如果对你的应用而言,使用MacRoman文本编码已经足够的话,可以使用CGContextSelectFont函数。在绘制文本时,调用CGContextshowtextAtPoint函数。CGContextSelectFont函数有4个参数:一个图形上下文,字体的postscript字体名,字体大小(用户空间单位),以及文本的编码。
如果想使用MacRoman以外的文本编码,应该使用CGContextSetFont和CGContextSetFontSize。必须为CGContextSetFont函数提供CGFont类型参数。调用CGFontCreateWithPlatformFont函数可以从ATS字体获得一个CGFont对象。绘制文本时,调用CGContextShowGlyphsAtPoint替代CGContextshowtextAtPoint。
原因就在于,在将文本字节映射为字体符号时,需要指定一个文本编码,默认的文本编码是kCGEnCodingfontspecific,当你调用CGContextshowtextAtPoint时,不能保证一定会获得一个文本编码。由于你调用CGContextSetFont而不是CGContextSelectFont来指定字体,在CGContextSetFont中你并没有指定文本编码,你也就不能使用CGContextshowtextAtPoint来绘制文本。
如果你要用这种方式设置字体,你必须用Cocoa或者自己实现将字符串映射为符号,这样你才能调用CGContextShowGlphsAtPoint。使用Cocoa绘制文本更简单,根本不需要任何Quartz2D函数。现在,你明白了使用Quartz绘制文本的一些限制,我们来看看使用CGContextSelectFont函数的一些例子。CGContextSelectFont函数的使用十分简单,但不建议你在MacRoman以外的编码下使用。清单16-1 显示了MyDrawText函数——用于绘制文本,如图16-1所示。代码后有详细的解释。
Listing16-1 Drawing text
voID MyDrawText (CGContextRef myContext,CGRect contextRect) // 1 |
{ |
float w,h; |
w = contextRect.size.wIDth; |
h = contextRect.size.height; |
|
CGAffinetransform myTexttransform; // 2 |
CGContextSelectFont (myContext,// 3 |
"Helvetica-Bold", |
h/10, |
kCGEnCodingMacRoman); |
CGContextSetCharacterSpacing (myContext,10); // 4 |
CGContextSetTextDrawingMode (myContext,kCGTextFillstroke); // 5 |
|
CGContextSetRGBFillcolor (myContext,1,.5); // 6 |
CGContextSetRGBstrokecolor (myContext,1); // 7 |
myTexttransform = CGAffinetransformMakeRotation (Myradians (45)); // 8 |
CGContextSetTextMatrix (myContext,myTexttransform); // 9 |
CGContextshowtextAtPoint (myContext,40,"Quartz 2D",9); // 10 |
} |
figure 16-1 使用Quartz函数绘制文
@H_920_404@
对于iOS,必须对当前图像上下文进行转换,以便文字方向与图16-1一样。这个转换可以将y轴的原点置于屏幕底部。清单16-2显示了怎样在drawRect:方法中使用这个转换。然后调用了MyDrawText方法。
@L_404_5@Listing 16-2 在iOS应用中绘制Quartz 2D文本
- (voID)drawRect:(CGRect)rect |
{ |
CGContextRef theContext = UIGraphicsGetCurrentContext(); |
CGRect vIEwBounds = self.bounds; |
|
CGContextTranslateCTM(theContext,vIEwBounds.size.height); |
CGContextScaleCTM(theContext,-1); |
|
// Draw the text using the MyDrawText function |
MyDrawText(theContext,vIEwBounds); |
} |
绘制之前计算文本大小
如果文本大小在你的应用中是重要的,可以用Quartz2D计算出来。计算某行文本的尺寸经过以下步骤:
调用函数CGContextGetTextposition获得当前文本位置 调用CGContextSetTextDrawingMode函数将文本设置为kCGTextInvisible。 调用CGContextshowtext绘制文本(在当前位置)。 调用CGContextGetTextposition得到文本的结束位置。 用截止位置减去开始位置,即可得到文本的宽度。复制 Font 变体
字体变体是包含在变体axis中的一个设置,允许你产生一系列打印风格。每个变体axis包括:
axis名称(如’wght’),指定了该变体axis所包含的风格。在字体变体axis的dictionary中,用关键字kCGFontvariationAxisname来检索。 最大值和最小值,在字体变体axis的dictionary中,用kCGFontvariationAxisMinValue和kCGFontvariationAxisMaxValue检索。 axis的默认值,在dictionary中,由kCGFontvariationAxisDefaultValue指定。例如,字重axis管理着字重的可能值——最小的值导致该字体以最淡的显示,最大的值产生最粗的字体。默认值使字体正常显示。axis是字体设计者设计的,对于有的字体,字体是可以有变体的,但不是所有字体都有变体。
关于变体,Quartz提供了3个函数:
CGFontCreatecopyWithVariations,创建一个字体的副本,指定一个变体设置。返回一个针对指定字体应用该变体设置进行变形后的字体。 CGFontcopyVariations,返回一个dictionary,包含了该字体所包含的变体,如果该字体不包含变体,返回NulL。 CGFontcopyVariationAxes,返回一个数组,包含了该字体所包含的变体axis的dictioanrys,如果字体不支持变体,返回NulL。postscript 字体
Quartz 提供如下函数以支持postscript字体:
获取PS字体名 判断是否可用PS格式创建一个字体的子集 创建字体的PS子集 创建字体的PS编码如果你想使用PS字体,请参考CGFont Reference .
总结以上是内存溢出为你收集整理的Quartz 2D 参考-文本全部内容,希望文章能够帮你解决Quartz 2D 参考-文本所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)