滚动文本字段由键盘覆盖

时间:2012-08-09 19:13:30

标签: iphone ios xcode uiscrollview

我正在努力让我的UIscroll在键盘阻止文本字段时滚动

http://developer.apple.com/library/ios/#documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html#//apple_ref/doc/uid/TP40009542-CH5-SW7

但遗憾的是......有一个变量提到,activeField我无法弄清楚它是如何声明的。我真的很想,如果有人可能会建议如何/在何处声明它,或者甚至是在键盘激活时滚动的解决方案都会有所帮助。

谢谢

3 个答案:

答案 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

以上对我有用。请记住,这些是文本字段委托方法。所以你需要设置你的代表。