此篇结合第一章中的例子查看示意。
coretext绘图流程:先创建一个framesetter——>创建path——>创建frame(携带framesetter和path等信息)——>生成上下文context——>CTFrameDraw绘制frame——>释放
一、CTFramesetter
用于生成frame,包含以下方法:
CFTypeID CTFramesetterGetTypeID( void );
// 创建framesetter(通过typesetter 和 通过字符串)
CTFramesetterRef CTFramesetterCreateWithTypesetter( CTTypesetterRef typesetter );
CTFramesetterRef CTFramesetterCreateWithAttributedString( CFAttributedStringRef string );
/* 创建frame
四个参数:
framesetter:生成frame的工厂
range:设置多大就显示多少字符。设置为0时,完整显示。
path:
frameAttributes:额外控制frame的属性字典。
*/
CTFrameRef CTFramesetterCreateFrame(CTFramesetterRef framesetter, CFRange stringRange, CGPathRef path, CFDictionaryRef _Nullable frameAttributes );
// 获取framesetter的typesetter
CTTypesetterRef CTFramesetterGetTypesetter( CTFramesetterRef framesetter );
/* 获取展示一串文字需要多大的空间
四个参数:
framesetter : 生成frame的工厂
stringRange : 设置多大就计算多少个字符的空间
frameAttributes : frame的属性
constraints :在多宽多高的空间里显示这些文字
fitRange :
*/
CGSize CTFramesetterSuggestFrameSizeWithConstraints( CTFramesetterRef framesetter, CFRange stringRange,CFDictionaryRef _Nullable frameAttributes,CGSize constraints,CFRange * _Nullable fitRange );
二、CTFrame类
包含以下方法:
CFTypeID CTFrameGetTypeID( void );
CFRange CTFrameGetStringRange( CTFrameRef frame );
// 获取真正在frame适应的字符的range
CFRange CTFrameGetVisibleStringRange( CTFrameRef frame );
// 获取用于创建frame的path
CGPathRef CTFrameGetPath( CTFrameRef frame );
// 获取用于创建frame的所有属性
CFDictionaryRef _Nullable CTFrameGetFrameAttributes( CTFrameRef frame );
// 获取组成frame的所有line
CFArrayRef CTFrameGetLines( CTFrameRef frame );
// 获得每一行的origin数组
void CTFrameGetLineOrigins( CTFrameRef frame, CFRange range, CGPoint origins[_Nonnull] );
// 此方法就是将CTFrame绘制到上下文
void CTFrameDraw( CTFrameRef frame, CGContextRef context );
设置frame的属性
const CFStringRef kCTFrameProgressionAttributeName;
typedef CF_ENUM(uint32_t, CTFrameProgression) {
kCTFrameProgressionTopToBottom = 0,
kCTFrameProgressionRightToLeft = 1,
kCTFrameProgressionLeftToRight = 2
};
const CFStringRef kCTFramePathFillRuleAttributeName;
typedef CF_ENUM(uint32_t, CTFramePathFillRule) {
kCTFramePathFillEvenOdd = 0,
kCTFramePathFillWindingNumber = 1
};
const CFStringRef kCTFramePathWidthAttributeName;
const CFStringRef kCTFrameClippingPathsAttributeName;
const CFStringRef kCTFramePathClippingPathAttributeName;
-- NORMAL --
-- NORMAL --