我正在努力让我的UIscroll在键盘阻止文本字段时滚动
但遗憾的是......有一个变量提到,activeField我无法弄清楚它是如何声明的。我真的很想,如果有人可能会建议如何/在何处声明它,或者甚至是在键盘激活时滚动的解决方案都会有所帮助。
谢谢
答案 0 :(得分:2)
要回答您的具体问题,因为Apple Documentation只使用activeField来表示大小数据,您可以简单地将其声明为私有全局 UIView * activeField ,它将适用于textFields ,textViews等都是一样的。
然而,他们的代码实际上根本不能很好地工作。我不得不对他们的代码进行一些更改,以使我的工作正常。这段代码基本上是他们的代码,有一些小的调整来处理下面列出的所有情况:
1)如果你有一个较小的scrollView嵌套在视图内,而不是全屏scrollView,它仍然有效。 2)如果要将文本字段向下移动到键盘焦点区域,并将其从键盘后面向上移动。 3)适用于各种大小的textViews和textFields 4)如果键盘当前正在显示,它会将任何新点击的字段移动到焦点区域 5)如果已经滚动了内容并调用键盘,则可以正常工作 6)适用于所有设备的所有键盘尺寸(无硬编码常量)
首先,为这些创建私有变量:
UIView *_activeField;
CGFloat _keyboardHeight;
BOOL _isShowingKeyboard;
接下来,只需将此代码剪切并粘贴到ViewController中(它看起来很多但不是那么糟糕)。
#pragma mark TextFieldKeyboardScrolling
- (void)registerForKeyboardNotifications {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil];
}
- (void)adjustInputFieldsForKeyboard {
CGFloat keyBoardTopInScrollView = self.view.frame.size.height - _keyboardHeight - self.scrollView.frame.origin.y;
CGFloat inputFieldBottomInVisibleScrollView = _activeField.frame.origin.y - self.scrollView.contentOffset.y + 30 /* small buffer for cursor size */;
CGPoint scrollPoint;
if (keyBoardTopInScrollView > inputFieldBottomInVisibleScrollView) {
scrollPoint = CGPointMake(0.0, self.scrollView.contentOffset.y - (keyBoardTopInScrollView - inputFieldBottomInVisibleScrollView));
} else {
scrollPoint = CGPointMake(0.0, self.scrollView.contentOffset.y + (inputFieldBottomInVisibleScrollView - keyBoardTopInScrollView));
}
[self.scrollView setContentOffset:scrollPoint animated:YES];
}
- (void)keyboardWasShown:(NSNotification*)aNotification {
_isShowingKeyboard = YES;
NSDictionary* info = [aNotification userInfo];
_keyboardHeight = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size.height;
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, _keyboardHeight, 0.0);
self.scrollView.contentInset = contentInsets;
self.scrollView.scrollIndicatorInsets = contentInsets;
[self adjustInputFieldsForKeyboard];
}
- (void)keyboardWillBeHidden:(NSNotification*)aNotification {
_isShowingKeyboard = NO;
UIEdgeInsets contentInsets = UIEdgeInsetsZero;
self.scrollView.contentInset = contentInsets;
self.scrollView.scrollIndicatorInsets = contentInsets;
}
#pragma mark UITextFieldDelegate
- (void)textFieldDidBeginEditing:(UITextField *)textField {
_activeField = textField;
if (_isShowingKeyboard) {
[self adjustInputFieldsForKeyboard];
}
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
_activeField = nil;
}
就是这样,只需调用[self registerForKeyboardNotifications];在你的viewDidLoad方法中,在故事板中连接你的scrollView插座和textField / textView委托,你就已经完成了设置。
答案 1 :(得分:0)
键盘仅在其中一个texfield变为活动状态时才会激活(成为第一响应者)。因此,您应该听UITextField委托方法,以查看何时以及哪个uitextfield成为第一响应者。 - (void)textFieldDidBeginEditing:(UITextField *)textField
如果您为文本字段分配标记或将其设置为ivar,您还可以了解哪个uitextfield已变为活动状态并获得其框架。
答案 2 :(得分:0)
我不使用滚动视图或按照上述文档。
以下是不使用滚动视图的方法 在我的
textFieldShouldBeginEditing
CGRect frame = self.view.frame;
frame.origin.y = <some negative value>;
self.view.frame = frame
和我的
textFieldShouldEndEditing
CGRect frame = self.view.frame;
frame.origin.y = <some positive value>; // absolute value of your above negative value
self.view.frame = frame
以上对我有用。请记住,这些是文本字段委托方法。所以你需要设置你的代表。