iOS 8中插入换行符后,UITextView无法自动滚动到光标位置的问题

3

iOS 8的UITextView自动滚动到插入符的行为比iOS 7的UITextView更好。但是,当文本视图的文本包含换行符(\n)时,我仍然看到滚动到插入符的行为存在问题。

以下是截图中描述的问题:

enter image description here

上图: 显示了UITextView的默认拉丁文本。请注意,在单词laborum之后插入了一个换行符。该文本在代码中设置。

enter image description here

上图: 用户点击最后一个单词civiuda后的空格,键盘弹出,文本视图会自动滚动到插入符。这是预期的行为。

enter image description here

上图: 用户点击键盘上的返回按钮,插入符被键盘遮挡。这是一个意外的问题。

如果我从文本视图的文本中删除换行符,则问题消失。此外,如果我将换行符移到文本的开头附近(例如,在第一个单词Lorem之后),问题也会消失。

我做错了什么吗?如果没有,有人可以提供一个解决方案吗?

UITextView在IB中使用自动布局进行实例化。

enter image description here

以下是代码:

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UITextView *textView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // text contains a newline character after the word 'laborum'; removing the newline character eliminates the scrolling issue
    self.textView.text = @"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\nNam liber te conscient to factor tum poen legum odioque civiuda.";

    self.textView.font = [UIFont systemFontOfSize:26];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
}

- (void)keyboardDidShow:(NSNotification *)notification
{
    NSDictionary *info = [notification userInfo];
    CGRect keyboardRect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    keyboardRect = [self.textView convertRect:keyboardRect fromView:nil];

    UIEdgeInsets insets = self.textView.contentInset;
    insets.bottom = keyboardRect.size.height;
    self.textView.contentInset = insets;
    self.textView.scrollIndicatorInsets = insets;

    // doesn't fix the scrolling issue
    [self.textView setNeedsLayout];
}

我尝试过的方法:

我尝试使用底部约束将文本内容推到键盘上方,而不是使用UITextViewcontentInset。但是出现了相同的滚动问题。

我在代码中实例化了UITextView。但是出现了相同的滚动问题。

有人建议说,点击返回键可能会被系统误解为完成编辑键。因此,我注册了键盘隐藏通知。但是它们没有被调用。


它可能只是在iOS 8上出现问题了。自iOS 7以来,已经有多次尝试修复文本视图(https://github.com/steipete/PSPDFTextView),但事实证明情况并没有得到很大的改善。 - pronebird
你能发一下你用来将滚动视图向下移动的代码吗?因为听起来像是当你按下回车键时,你的视图会像键盘退出一样向下滚动...就好像它把“return”误认为是用户编辑结束的标志。 - Lyndsey Scott
@LyndseyScott 代码已经发布在我帖子的最底部。请注意,第二次点击回车键会重新建立正常的滚动到插入符号行为。 - bilobatum
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Lyndsey Scott
@LyndseyScott 好的,我测试了你的理论。当我按回车键时,隐藏键盘通知并没有被调用。但还是谢谢。 - bilobatum
1个回答

0

试试这个:

#param mark - UITextViewDelegate

- (void)textViewDidChangeSelection:(UITextView *)textView
{
    if (IOS8) {
        [self.textView scrollRangeToVisible:self.textView.selectedRange];
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接