CTFrame布局是由Path 和CTLine 组成的。
我们能从CTLine中获取到什么信息呢。
我们从以下方面 Line Types, Line Creation,Line Access ,Line Measurement, Line Caret Positioning and Highlighting
1. Line Types
|
|
枚举值 CTLineBoundsOptions 和 CTLineTruncationType
|
|
目前看上面的枚举值不知道具体有啥用。放过,等看完下面的回来补充。
|
|
2.Line Creation
|
|
效果如下:
文字一行排开。
|
|
头部截断效果如下:
|
|
效果如图
要是文本过长,justificationFactor 必须大于等于 1 否则,不进行CTLine绘制。
代码如下
|
|
效果图:
文字压扁了。
3.Line Access
CFIndex CTLineGetGlyphCount( CTLineRef line ) | 获取Glyph的个数 |
---|---|
CFArrayRef CTLineGetGlyphRuns(CTLineRef line ) | 获取CTRunRef数组 |
CFRange CTLineGetStringRange(CTLineRef line ) | 获取线所在字符串的范围 |
double CTLineGetPenOffsetForFlush( CTLineRef line, CGFloat flushFactor, double flushWidth ) | 文本flushFactor比例的距离到flushWidthflushFactor的距离 flushFactor大于1 相当于1操作。公式 假设文本长度textWidth 结果result=flushWidth flushFactor - flushFactor * textWidth |
void CTLineDraw( CTLineRef line, CGContextRef context ) | 绘制线。位置是从底部向上绘制。 |
|
|
从上面结果看:CTLineGetStringRange获取的范围可能会有问题。用的时候要小心(要是自己创建CTline的话)这个只是自己创建的CTline不准,而CTFrame创建的CTLine是没问题的。
CTLineGetPenOffsetForFlush 函数相当于 文本到某点还有多少距离。
测试代码是
|
|
如图
打印结果是2017-02-24 19:33:15.061 CoreTextDemo[4317:74402] line offset 126.000000
4.Line Measurement
CTLineGetTypographicBounds( CTLineRef line,CGFloat __nullable ascent,CGFloat nullable descent, CGFloat * nullable leading ) | 获取线 的ascent descent leading ,返回宽度 |
---|---|
CGRect CTLineGetBoundsWithOptions(CTLineRef line,CTLineBoundsOptions options ) | 目前还不知道CTLineBoundsOptions 代表啥。 应该与富文本的设置有关。暂时不做研究(这个就是获取不同设置line的bounds的) |
double CTLineGetTrailingWhitespaceWidth(CTLineRef line ) | 目前还不会用(获取结尾空白的宽度) |
CGRect CTLineGetImageBounds(CTLineRef line,CGContextRef __nullable context ) | 目前还不会用(获取的是line绘制成图片的尺寸) |
|
|
5.Line Caret Positioning and Highlighting
CFIndex CTLineGetStringIndexForPosition(CTLineRef line,CGPoint position ) | 获取线position位置的String index |
---|---|
CGFloat CTLineGetOffsetForStringIndex(CTLineRef line,CFIndex charIndex,CGFloat * __nullable secondaryOffset ) | 获取index位置字符的偏移量。目前不知道 返回结果和secondaryOffset 的区别 |
void CTLineEnumerateCaretOffsets(CTLineRef line,void (^block)(double offset, CFIndex charIndex, bool leadingEdge, bool* stop) ) CT_AVAILABLE(10_11, 9_0) | 返回每个字体的前后边沿 |
|
|
CTLine 的模型图
难点公关
CTLineGetBoundsWithOptions
代码测试
|
|
效果图:
从结果可以看出来:
1.0 、 kCTLineBoundsExcludeTypographicLeading 和kCTLineBoundsExcludeTypographicShifts 结果相同 都是计算的是 line 的印刷边界。
2.而 kCTLineBoundsUseHangingPunctuation 和 kCTLineBoundsUseGlyphPathBounds 结果相同。 kCTLineBoundsUseHangingPunctuation 这个计算结果包含结尾的标点符号 。kCTLineBoundsUseGlyphPathBounds 而用字符的path 而不是边界
3.kCTLineBoundsUseOpticalBounds 和 kCTLineBoundsIncludeLanguageExtents
4.这些属性直接可以 与 操作 eg: CGRect rect = CTLineGetBoundsWithOptions(line,kCTLineBoundsExcludeTypographicLeading|kCTLineBoundsUseHangingPunctuation); 具体组合结果 可自行研究。
CTLineGetTrailingWhitespaceWidth
获取结尾的宽度
|
|
CTLineGetImageBounds
|
|
看的出来 是绘制的最小尺寸。要是排版line 不太好用