2012-08-09 70 views
1

林让我的工作UIscroll按照本文档滚动文本框覆盖键盘

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

滚动当过一个文本框被键盘封锁然而可悲的是...有一个变量提到,activeField我无法弄清楚它是如何声明的。我真的很喜欢,如果有人可能会建议如何/何处被宣布,或者甚至是在键盘被激活时滚动的解决方案将会有所帮助。

谢谢

回答

2

为了回答您的具体问题,因为Apple Documentation只会被使用activeField的尺寸数据,可以简单地声明这是私人全球的UIView * activeField,它会为文本框,textViews等都是一样的工作。

但是,他们的代码实际上并不能很好地工作。我不得不对他们的代码进行一些更改以使我的工作正常进行。这个代码基本上是他们的一些小调整,以处理下面列出的所有情况:

1)如果你有一个较小的scrollView嵌套在视图内,而不是全屏幕scrollView,它仍然工作。 2)如果您想将文本字段向下移动到键盘焦点区域并将其从键盘后面向上移动。 3)适用于各种尺寸的textViews和textField 4)如果键盘当前正在显示,它会将任何新近点击的字段移动到焦点区域 5)如果您的内容已经滚动并调用键盘,则工作 6)适用于所有的键盘尺寸为所有设备(没有硬编码常量)

首先,创建私有变量,这些:

UIView *_activeField; 
CGFloat _keyboardHeight; 
BOOL _isShowingKeyboard; 

接下来,只要剪切和将此代码粘贴到您的视图控制器(它看起来像很多但并不糟糕)。

#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代表放在故事板中,并且你已经完成设置。

0

键盘才有效,当texfields的一个被激活(成了第一个响应者)。所以,你要听的UITextField委托方法时看到并成为的UITextField第一个响应。 - (空)textFieldDidBeginEditing:(*的UITextField)文本框

,如果你指定一个标记来您的文本字段或使其伊娃还可以了解哪些的UITextField变得活跃,也获得了框架。

+1

我了解的第一个响应者的一切......我不明白这是 “活跃的领域” - (空)textFieldDidBeginEditing:(*的UITextField)文本框 { activeField =文本框; } 我不知道如何传递给它什么文本字段是第一响应者 – 2012-08-09 19:43:16

+0

它只是一个伊娃保存触发委托方法的文本字段。 – 2012-08-09 19:45:19

+0

我想,但我不知道如何在.h文件中声明“activefield” int activeField;? – 2012-08-09 20:15:35

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

以上为我工作。记住这些是文本字段委托方法。所以你需要设置你的委托。