0

我遇到了这个很好的例子,它帮助我理解了如何在使用 iOS7 在 UITextView 中键入时实现行间距/段落间距,但是有一个问题,我希望有人可以帮助我解决我仍在学习的问题关于TextKit请。

这是实际示例 https://github.com/downie/DoubleSpacedTextView

我附上了2个文件:-

1- 这是问题的视频:- http://1drv.ms/1o8Rpd2

2-这是我正在测试的项目:http: //1drv.ms/1o8RtK0

问题是当文本行之间有空行(至少 2 个空行),然后在空行内单击以激活 UITextView 并显示键盘时,文本向上移动/失去其格式。

这是我对原始版本进行了轻微修改的核心功能,它进行了格式化,它工作得很好,但当你第一次在 UITextView 内单击时它就不行了:-

- (void) formatText
{
        __block CGFloat topOffset = 0;

        NSRange lineGlyphRange = [self.layoutManager glyphRangeForTextContainer:self.textContainer];

        [self.layoutManager 
         enumerateLineFragmentsForGlyphRange:lineGlyphRange usingBlock:^(CGRect rect, CGRect usedRect, NSTextContainer *textContainer, NSRange glyphRange, BOOL *stop)
         {
             CGRect adjustedRect = rect;
             CGRect adjustedUsedRect = usedRect;
             adjustedRect.origin.y = topOffset;
             adjustedUsedRect.origin.y = topOffset;

             [self.layoutManager setLineFragmentRect:adjustedRect forGlyphRange:glyphRange usedRect:adjustedUsedRect];

             topOffset += 30; // 30 is the space between the lines you can adjust this as you like
         }];

        CGRect adjustedExtraLineFragmentRect = self.layoutManager.extraLineFragmentRect;
        CGRect adjustedExtraLineFragmentUsedRect = self.layoutManager.extraLineFragmentUsedRect;
        adjustedExtraLineFragmentRect.origin.y = topOffset;
        adjustedExtraLineFragmentUsedRect.origin.y = topOffset;

        [self.layoutManager setExtraLineFragmentRect:adjustedExtraLineFragmentRect usedRect:adjustedExtraLineFragmentUsedRect textContainer:self.textContainer];
}

你能看看我们是否可以阻止这种情况发生吗?这样文本在我们输入 UITextView 时总是被格式化。

是否有任何其他示例显示我们如何使用 TextKit 或属性文本将格式化文本(带行距)键入 UITextView?

自iOS6以来,我一直在努力解决这个问题。

谢谢,

将要

4

1 回答 1

1

我没有完整的解决方案,只有在哪里寻找解决方案的想法。

所有布局代码都会触发 UITextView 的 textChange 事件。四处移动光标不会更改该文本的任何内容,因此不会调用任何代码。但是,即使将其附加到 textViewDidChangeSelection 也不会使问题消失。

我认为这可能是以下两件事之一:

  • NSLayoutManager 处理空白行的方式与处理带有文本的行不同。这要么意味着它是一个 TextKit 错误,要么它是许多没有被调用的委托/方法之一。
  • 关于 rect 数学的某些东西对于空行是错误的。我相信如果该行是空白的,布局中唯一的关键区别是 lineFragmentRect 的 usedRect 的宽度为 0,但它的高度可能也为 0 或错误的偏移量会弄乱数学。我真的不明白是什么原因造成的。
于 2014-06-16T15:54:52.977 回答