【问题标题】:Core text exactly same as UITextView text format?核心文本与 UITextView 文本格式完全一样?
【发布时间】:2011-04-25 17:27:36
【问题描述】:

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

短句或单词没关系,但如果UITextView和Core Text有多行,它们的结果就会变得非常不同。例如,UITextView 在行尾对一个单词执行自动换行,而 Core Text 将该单词保留在同一行中。如果你看附图,最后一个单词“段落”的起始位置已经相差很大(8个空格字符导致8个像素间隙)。

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

我正在使用 Core Text 在UITextView 中查找当前光标的像素位置,因此它们应该完全匹配,每行包含相同数量的字符和单词。

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

谢谢!

这是我如何设置属性字符串的代码。 (我只是遵循核心文本指南。)

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);

-

-

这是一张图片。

【问题讨论】:

    标签: iphone ipad ios uitextview core-text


    【解决方案1】:

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

    【讨论】:

    • 请问你把宽度改成什么了?最初是 1139,但我找不到一个完美排列的数字。
    【解决方案2】:

    您的解决方案可能适用于特定磅值的特定字体,但您通常不能依赖它。 CoreText 根本不兼容普通的 UILabel、UITextView:s 或 UIStringDrawing,所以你不能混合它们。

    您要么只使用 CT 函数来处理所有字符串(包括实现自定义输入,如果这是你需要的),要么根本不使用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-30
      • 2014-10-30
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      相关资源
      最近更新 更多