ScrollView的scrollRectToVisible键盘通知在iOS中无法正常工作11

问题描述:

我有一个滚动视图,其中包含许多文本字段作为子视图,我希望所选文本字段(_activeField)在键盘出现时向上滚动。ScrollView的scrollRectToVisible键盘通知在iOS中无法正常工作11

- (void) keyboardUP:(NSNotification *)notification 
{ 
NSDictionary* info = [notification userInfo]; 
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height + 10, 0.0); 
_scroller.contentInset = contentInsets; 
_scroller.scrollIndicatorInsets = contentInsets; 

CGRect aRect = App_Delegate.window.frame; 
aRect.size.height -= kbSize.height; 

CGRect rect = [_activeField convertRect:_activeField.frame fromView:App_Delegate.window]; 

if (!CGRectContainsPoint(aRect, rect.origin)) 
{ 
    [_scroller scrollRectToVisible:rect animated:YES]; 
} 

}

此代码为iOS 10工作正常,但在iOS的11,其没有工作,“scrollRectToVisible”不滚动了滚动,即使其内容的大小是正确的。

+0

尝试使用[TPKeyboardAvoiding(https://开头github.com/michaeltyson/TPKeyboardAvoiding)而不是,更容易 – Srdjan

+0

我基本上很好奇,知道是否有限制这个代码的功能的iOS11中的ScrollView有任何特定的变化。 –

+0

我有同样的问题,没有时间检查,因为生产应用程序有问题,所以我添加了库,它是固定的 – Srdjan

这是this issue的副本。

使用UIKeyboardFrameEndUserInfoKey

if let userInfo = notification.userInfo { 
    if let keyboardSize = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { 
     print(keyboardSize) 
    } 
} 

和ObjC

- (void)keyboardWillShow:(NSNotification *)notification { 
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size; 
} 
+1

这不是您链接问题的重复内容。而你的回答并不能解决问题。 –

+0

Vin Gazoil,我有一个OPs确切问题的项目,停止使用iOS11。这是解决方案,并且之前已经讨论过。为什么不告诉我你正在谈论的内容,因为我认为你的评论在任何意义或方式上都是不恰当的。 – aug2uag

+0

在链接的问题中,OP无法获得键盘的高度,这里OP在scrollRectToVisible函数中遇到了问题。你提供的代码可能解决你的问题,它没有解决我的问题(与OP的一样),但是恕我直言,这是一个糟糕的解决方案,因为真正的问题是,正如Peter提到的,这个函数没有在主线程中调用。对不起,如果我的第一个评论是有点粗鲁。 –

我不知道

- (void) keyboardUP:(NSNotification *)notification 

,但已经看到了

- (void)handleKeyobardDidShowNotification:(NSNotification *)notification 
0类似的问题

它看起来像这样不再iOS的主线程上运行11

尝试运行你打电话scrollRectToVisible主线程上进行如下

dispatch_async(dispatch_get_main_queue(), ^{ 
     [_scroller scrollRectToVisible:targetPosition animated:YES]; 
    });