iOS7使用行间距键入UITextView并使用TextKit保持格式

时间:2014-06-09 22:03:49

标签: ios7 uitextview textkit nslayoutmanager

我遇到了这个很好的例子,它让我了解如何在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或属性Text将格式化文本(带行间距)键入UITextView。

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

谢谢,

威尔

1 个答案:

答案 0 :(得分:1)

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

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

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

  • NSLayoutManager处理空白行的方式与包含文本的行不同。这或者意味着它是一个TextKit错误,或者它是没有被调用的许多委托/方法之一。
  • 关于rect数学的东西是空行的错误。我认为,如果行是空白而不是布局中唯一的关键区别是lineFragmentRect的usedRect的宽度为0,但也许它的高度为0或者是错误的数学偏移。我不知道是什么导致了这一点。