如何检查键盘是否覆盖了 a 内的第一响应者,UIScrollView
这可能是也可能不是UITableView
?请注意,UIScrollView
不一定会覆盖整个 viewController 的视图,并且可能包含在模态视图 ( UIModalPresentationFormSheet
) 中。
我正在使用Apple 参考文档和示例中的修改后的代码,但CGRectContainsPoint
即使键盘明显覆盖了第一响应者,也会返回 false。很明显我没有convertRect:toView
正确使用。
此外,Apple 的代码没有考虑到视图不是全屏的,因此将 scrollView 的 contentInset 设置为键盘的全高并不是一个很好的解决方案——它应该只插入键盘覆盖的部分第一个响应者。
- (void)keyboardWasShown:(NSNotification*)aNotification
{
// self.scrollView can be a tableView or not. need to handle both
UIView *firstResponderView = [self.scrollView findFirstResponder];
if (!firstResponderView)
return;
NSDictionary* info = [aNotification userInfo];
CGRect rect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
// convertRect:toView? convertRect:fromView? Always confusing
CGRect kbRect = [self.scrollView convertRect:rect toView:nil];
CGRect viewRect = [self.scrollView convertRect:firstResponderView.bounds toView:nil];
// doesn't work. convertRect misuse is certainly to blame
if (!CGRectContainsPoint(kbRect, firstResponderView.frame.origin))
return;
// Only inset to the portion which the keyboard covers?
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbRect.size.height, 0.0);
self.scrollView.contentInset = contentInsets;
self.scrollView.scrollIndicatorInsets = contentInsets;
}