为什么 resignFirstResponder 在 UITextView 上重置 contentOffset?

Why does resignFirstResponder reset contentOffset on a UITextView?

无论我尝试更改哪个设置,resignFirstResponder 总是强制文本滚动到 UITextView

的顶部

我希望键盘消失但内容偏移量保持不变。

任何解决方案将不胜感激。

在 viewDidLoad 中

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

添加此功能

 - (void)keyboardWillHide:(NSNotification *)notification
{
NSDictionary *info = [notification userInfo];
NSTimeInterval animationDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

[UIView animateWithDuration:animationDuration animations:^{
[_textView scrollRangeToVisible:NSMakeRange([_textView.text length], 0)];
}];
}

这是由 iOS 8 中的 UIScrollView 错误引起的。希望在 iOS 9 中他们修复了它。我只是假设它是一个错误,因为 resignFirstResponder 在 iOS 7 中没有这种行为。也许它是一个功能。

我发现防止 resignFirstRespondersetText 重置 contentOffset 的唯一方法如下:

Swift:

textView.layoutManager.allowsNonContiguousLayout = false

Objective C

textView.layoutManager.allowsNonContiguousLayout = NO;

我认为它是一个错误的另一个原因是因为文档说它默认设置为 NO,但是当您打印出变量而不设置它时,它是正确的。

可以找到有关 NSLayoutManager 的更多信息 here