核心文本与UITextView文本格式完全相同?

时间:2010-10-15 01:29:29

标签: iphone ipad ios uitextview core-text

我正在尝试设置与CTFrame在iPad中的UITextView文本格式完全匹配的UITextView。 首先,我将UITextView的文本转换为属性字符串。然后我设置了绘图框的宽度和高度,其中Core Text将绘制文本。 我成功地使用Core Text绘制文本,但[UIFont systemFontOfSize:21]和Core Text显示略有不同的结果,即使我使用相同的字体和大小。 具体来说,当我使用UITextView时,UITextView中的每个空格都比Core Text的结果多一个像素。

短句或单词是可以的,但如果UITextView和核心文本有多行,则结果会变得非常不同。例如,UITextView对行尾的一个单词执行自动换行,而Core Text将该单词保留在同一行。如果你看到附图,最后一个单词“paragraph”的起始位置已经非常不同了(由于8个空格字符,8个像素的间隙)。

更糟糕的是,如果我使用不同的字体,例如添加到我的项目中的自定义字体,UITextView中的每个字符都会增加1个像素。

我正在使用Core Text在CTFontRef font = CTFontCreateWithName((CFStringRef) [UIFont systemFontOfSize:21.0].fontName, 21.0, NULL); CFMutableAttributedStringRef attrString2 = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0); CFAttributedStringReplaceString (attrString2, CFRangeMake(0, 0), (CFStringRef) string); CFAttributedStringSetAttribute(attrString2, CFRangeMake(0, [string length]),kCTFontAttributeName, font); 中查找当前光标的像素位置,因此它们彼此完全匹配,每行包含相同数量的字符和单词。

问题:有没有办法让Core Text对象与UITextView的文本格式完全匹配?

谢谢!

以下是我如何设置属性字符串的代码。 (我刚刚关注了Core Text Guide。)

{{1}}

-

-

这是一张照片。

alt text

2 个答案:

答案 0 :(得分:3)

您的解决方案可能适用于特定点大小的特定字体,但您通常不能依赖它。 CoreText与普通的UILabel,UITextView:或UIStringDrawing完全不兼容,所以你不能混用它们。

您必须仅使用CT函数进行所有字符串处理(包括实现自定义输入,如果这是您需要的)或根本不使用它们。

答案 1 :(得分:1)

回答我自己。 我刚发现很简单的解决方案!使用任何字体编辑器,您只需更改空格字符的宽度(ascii值32); UITextView的原始字体和Core Text的修改字体,反之亦然。我使用了免费的字体编辑器FontForge。虽然我仍然需要进行一些极端情况测试,例如在同一行中编写日文字符和英文字母等,现在几乎可以在UITextView中找到光标/插入符的像素位置。