【问题标题】:scroll textfield covered by keyboard滚动键盘覆盖的文本字段
【发布时间】:2012-08-09 19:13:30
【问题描述】:

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

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

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

谢谢

【问题讨论】:

    标签: iphone ios xcode uiscrollview


    【解决方案1】:

    要回答您的具体问题,由于 Apple Documentation 只使用 activeField 来获取大小数据,您可以简单地将其声明为私有全局 UIView *activeField,它适用于 textFields、textViews等等都一样。

    但是,他们的代码实际上并不能很好地工作。我必须对他们的代码进行一些更改才能让我的代码正常工作。这段代码基本上是他们的,只是做了一些小的调整来处理下面列出的所有情况:

    1) 如果您在视图中嵌套了一个较小的滚动视图,而不是全屏滚动视图,它仍然可以工作。 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 代表,一切就绪。

    【讨论】:

      【解决方案2】:

      只有当其中一个 texfields 变为活动状态(成为第一响应者)时,键盘才处于活动状态。因此您应该听 UITextField 委托方法以查看何时以及哪个 uitextfield 成为第一响应者。 - (void)textFieldDidBeginEditing:(UITextField *)textField

      如果您为您的文本字段分配标签或将其设为 ivar,您还可以了解哪个 uitextfield 已变为活动状态并获取其框架。

      【讨论】:

      • 我了解第一响应者的一切...我不明白的是“活动字段” - (void)textFieldDidBeginEditing:(UITextField *)textField { activeField = textField;我不知道我如何传递给它什么文本字段是第一响应者
      • 只是一个ivar,用来保存触发委托方法的textfield。
      • 我想到了,但我不知道如何在 .h 文件 int activeField 中声明“activefield”;?
      【解决方案3】:

      我不使用滚动视图或遵循上述文档。

      这是不使用滚动视图的方法 在我的

      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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-06
        • 2022-08-07
        • 2020-10-13
        • 2015-05-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-28
        • 2018-12-22
        相关资源
        最近更新 更多