我正在尝试设置与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}}
这是一张照片。
答案 0 :(得分:3)
您的解决方案可能适用于特定点大小的特定字体,但您通常不能依赖它。 CoreText与普通的UILabel,UITextView:或UIStringDrawing完全不兼容,所以你不能混用它们。
您必须仅使用CT函数进行所有字符串处理(包括实现自定义输入,如果这是您需要的)或根本不使用它们。
答案 1 :(得分:1)
回答我自己。 我刚发现很简单的解决方案!使用任何字体编辑器,您只需更改空格字符的宽度(ascii值32); UITextView的原始字体和Core Text的修改字体,反之亦然。我使用了免费的字体编辑器FontForge。虽然我仍然需要进行一些极端情况测试,例如在同一行中编写日文字符和英文字母等,现在几乎可以在UITextView中找到光标/插入符的像素位置。