iOS sdk中为我们提供了一套完善的文字排版开发组件:CoreText。CoreText库中提供了很多的工具来对文本进行操作,例如CTFont、CTLine、CTFrame等。利用这些工具可以对文字字体每一行每一段落进行操作。
此例中默认图片都在右上方,且为了美观和开发简便设定所占宽度都相同。
2.设置文本的参数
创建一个NSMutableAttributedString对象,包含所需展示的文本字符串。这样就可以对其进行设置了。通过CTFontCreateWithName函数创建一个CTFont对象,利用NSMutableAttributedString对象的addAttribute方法进行设置。类似的方法可以设置字间距。对其方式与行间距的设置方式:- // 文本对齐方式
- CTTextAlignment alignment = kCTLeftTextAlignment;
- CTParagraphStyleSetting alignmentStyle;
- alignmentStyle.spec = kCTParagraphStyleSpecifierAlignment;
- alignmentStyle.valueSize = sizeof(alignment);
- alignmentStyle.value = &alignment;
- // 创建设置数组
- CTParagraphStyleSetting settings[] ={alignmentStyle};
- CTParagraphStyleRef style = CTParagraphStyleCreate(settings, 1);
同样使用addAttribute设置字符串对象。这样的方法还可以设置行间距,段间距等参数。
4.由于图片宽度是固定的这样就可以计算每行文字缩短的字数。只要文本的总体高度低于图像总高度则文字长度都是缩短的。用CTTypesetterSuggestLineBreak函数动态的计算每一行里的字数,因为每一行里面的中文字、标点符号、数
字、字母都不一样所以可以显示的字数肯定也是不同的,所以需要作这样的计算。这样循环直至文本结束,就可以知道有多少行字了。再根据字体高度和行间距得出总的文本高度,如果文本高度大于图片总高度那么显示区域的Frame高度就是
文本的高度,反之亦然。
- CFRange lineRange = CFRangeMake(currentIndex, lineLength);
- 建立文本行对象
- CTLineRef line = CTTypesetterCreateLine(typeSetter, lineRange);
- CGFloat x = [self textOffsetForLine:line inRect:self.bounds];
- // 设置一行的位置
- CGContextSetTextPosition(context, x, y);
- // 绘制一行文字
- CTLineDraw(line, context);