我正在使用UITextView,我希望文本居中。但是,这并没有完全发挥作用。当在不是最后一行的另一行的末尾添加一个新行,或者按空行时,插入符号将自己定位在textview的左侧,当你开始键入它时通常跳到中心。但有时它会保持左对齐,文本本身也会左对齐。
创建UITextView并以编程方式或通过故事板设置对齐似乎并不重要。 您可以通过添加UITextView并将对齐设置为居中或右对齐来轻松地自行测试,因为这似乎有同样的问题。
用于说明问题的gif:http://i.stack.imgur.com/aZxrK.gif
答案 0 :(得分:1)
这是我最接近解决方案的方法:
我实施了UITextViewDelegate
的{{1}}方法,并检查输入的文字是否不是文本末尾的换行符。如果是这种情况,我会在其中添加一个空格并将其放入文本视图中。这导致插入符号出现在中心。
唯一的缺点是你有一个用户没有进入的空间,如果他删除它,那么插入符号再次移动到左侧。不过,它总比没有好。
这是我使用的代码:
textView:shouldChangeTextInRange:replacementText:
答案 1 :(得分:1)
之前:
之后
这显然是一个错误,仍然存在于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