UITextView对齐,插入符号左侧

时间:2014-10-23 08:49:47

标签: ios iphone textview alignment uitextview

我正在使用UITextView,我希望文本居中。但是,这并没有完全发挥作用。当在不是最后一行的另一行的末尾添加一个新行,或者按空行时,插入符号将自己定位在textview的左侧,当你开始键入它时通常跳到中心。但有时它会保持左对齐,文本本身也会左对齐。

创建UITextView并以编程方式或通过故事板设置对齐似乎并不重要。 您可以通过添加UITextView并将对齐设置为居中或右对齐来轻松地自行测试,因为这似乎有同样的问题。

用于说明问题的gif:http://i.stack.imgur.com/aZxrK.gif

3 个答案:

答案 0 :(得分:1)

这是我最接近解决方案的方法:

我实施了UITextViewDelegate的{​​{1}}方法,并检查输入的文字是否不是文本末尾的换行符。如果是这种情况,我会在其中添加一个空格并将其放入文本视图中。这导致插入符号出现在中心。

唯一的缺点是你有一个用户没有进入的空间,如果他删除它,那么插入符号再次移动到左侧。不过,它总比没有好。

这是我使用的代码:

textView:shouldChangeTextInRange:replacementText:

答案 1 :(得分:1)

之前:

enter image description here

之后

enter image description here

这显然是一个错误,仍然存在于iOS12中。由于不能使用某些技巧,例如粘贴一个不可见的空间然后再次替换它,因此我终于找到了一种最佳的解决方案,该解决方案就像一个魅力。

textAlignment设置为每个textDidChange:的中心位置并没有感觉正确,也没有帮助。我宁愿设置一次对齐方式,然后覆盖caretRectForPosition:子类中的UITextView,返回居中的插入记号rect。

请注意,仅当您位于UITextView中多行文本的中间,并且插入符号之前之后时,才会出现该错误。因此,我们正是在寻找这种情况,并帮助iOS正确定位插入符号。

这是ObjC中的代码段:

-(CGRect)caretRectForPosition:(UITextPosition *)position {
    CGRect superclassRect = [super caretRectForPosition:position];
    NSRange selectedTextRange = [self selectedRange];
    NSRange rangeOfCaret = NSMakeRange(selectedTextRange.location + selectedTextRange.length, 0);
    NSRange rangeOfCharBeforeCaret = NSMakeRange(rangeOfCaret.location - 1, 1);
    NSRange rangeOfCharAfterCaret = NSMakeRange(rangeOfCaret.location, 1);
    NSRange fullRange = NSMakeRange(0, self.text.length);

    if (NSLocationInRange(rangeOfCharBeforeCaret.location, fullRange) && NSLocationInRange(NSMaxRange(rangeOfCharAfterCaret), fullRange) && /* This check is sufficient to safely call substringWithRange. In general case we would have to check both endpoints of both ranges */
    [[self.text substringWithRange:rangeOfCharBeforeCaret] isEqualToString:@"\n"] && [[self.text substringWithRange:rangeOfCharAfterCaret] isEqualToString:@"\n"]) {
        // Newline before and after the caret. Make it centered
        CGFloat currentCenterXOfCaret = CGRectGetMidX(superclassRect);
        CGFloat centerXOfCenteredCaret = CGRectGetMidX(self.bounds);
        CGFloat correction = centerXOfCenteredCaret - currentCenterXOfCaret;
        CGRect rectOfCenteredCaret = CGRectOffset(superclassRect, correction, 0);

        return rectOfCenteredCaret;
    }

    return superclassRect;
}

答案 2 :(得分:-1)

UITextView中有两个错误。

  • textAlign转到左侧
  • caretRect转到左侧

我分叉了https://stackoverflow.com/a/53295470/11226828。对我来说很好。

https://gist.github.com/wata/bf7112fe46959ff18f9356137407f985