在 ViewA 之上有一个 subview 。请在下面找到屏幕布局。当键盘在选择 UITextField 时显示,即使它不与 UITextField 重叠, View 也会向上滚动。
ViewA
-> UIButton
subView
-> UIScrollView
-> UITextField
-> UITextField
ViewA
-----------
| |
| |
| Button |
| |
| |
-----------
subView
--------------
| |
| |
| UITextField |
| UITextField |
| |
--------------
我已经注册了键盘通知
- (void) viewWillAppear:(BOOL)animated {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidShow:)
name:UIKeyboardDidShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillBeHidden:)
name:UIKeyboardWillHideNotification
object:nil];
}
- (void) keyboardDidShow:(NSNotification *)notification {
NSDictionary* info = [notification userInfo];
CGRect kbRect = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbRect.size.height, 0.0);
self.scrollViewIb.contentInset = contentInsets;
self.scrollViewIb.scrollIndicatorInsets = contentInsets;
CGRect aRect = self.viewSelf.frame;
aRect.size.height -= kbRect.size.height;
CGRect frame = [self.viewSelf convertRect:self.activeField.frame toView:self.viewSelf.superview];
if (!CGRectContainsPoint(aRect, frame.origin) ) {
[self.scrollViewIb scrollRectToVisible:self.activeField.frame animated:YES];
}
}
- (void) keyboardWillBeHidden:(NSNotification *)notification {
self.scrollViewIb.scrollEnabled = true;
UIEdgeInsets contentInsets = UIEdgeInsetsZero;
self.scrollViewIb.scrollIndicatorInsets = contentInsets;
[self.scrollViewIb setContentOffset:CGPointZero animated:false];
}
最佳答案
坐标系转换有一个小错误:convertRect:toView:从接收器的坐标系 转换为传递的 View 的坐标。
如果 self.activeField.frame
如代码所示是 self.scrollViewIb
坐标系中的一个矩形,那么转换应该是这样的...
CGRect frame = [self.scrollViewIb convertRect:self.activeField.frame toView:self.view];
请注意,我还建议将 self.viewSelf.superview
更改为 self.view
。如果此代码在包含所有这些 subview 的 View Controller 中运行,则 self.view 应该足够且正确。
关于ios - 键盘重叠时向上移动 UITextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44120176/