首页 文章

焦点和键盘隐藏文本字段时滚动到文本字段

提问于
浏览
3

我有多个文本字段,当我专注于文本框时,它会自动向上滚动,键盘隐藏文本字段 .

知道如何在点击时将文本字段滚动到焦点字段吗?

- (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)textFieldDidBeginEditing:(UITextField *)textField
{
    activeField = textField;
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    activeField = nil;
}
// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;
}
- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;

    // If active text field is hidden by keyboard, scroll it so it's visible
    // Your application might not need or want this behavior.
    CGRect aRect = self.view.frame;
    aRect.size.height -= kbSize.height;
    if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
        CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y-kbSize.height);
        [scrollView setContentOffset:scrollPoint animated:YES];
    }
}

1 回答

  • 2

    您发布的代码片段我认为是Apple的文档中的代码片段,它假设一个基本的视图层次结构,其中UIScrollView(或其子类之一,如UITableView)填满整个屏幕 . 如果视图布局更复杂,或者您需要支持多个方向,则文本字段将不会滚动到可见,因为矩形计算将是错误的 . 您需要稍微调整一下代码,我的建议是您以这种方式解决问题:

    滚动视图的新contentInsent高度应等于键盘和滚动视图之间的交叉矩形的高度 .

    在代码中:

    - (void)keyboardWasShown:(NSNotification*)aNotification
    {
        CGRect kbRawRect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];    
        CGRect scrollViewFrame = [self.scrollView.window convertRect:self.scrollView.frame fromView:self.scrollView.superview];
    
        // Calculate the area that is covered by the keyboard
        CGRect coveredFrame = CGRectIntersection(scrollViewFrame, kbRawRect);
        // Convert again to window coordinates to take rotations into account
        coveredFrame = [self.scrollView.window convertRect:self.scrollView.frame fromView:self.scrollView.superview];
    
        UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, coveredFrame.size.height, 0.0);
        self.scrollView.contentInset = contentInsets;
        self.scrollView.scrollIndicatorInsets = contentInsets;
    
        // If active text field is hidden by keyboard, scroll it so it's visible
        CGRect activeFieldRect = [self.activeField convertRect:self.activeField.bounds toView:self.scrollView];
       [self.scrollView scrollRectToVisible:activeFieldRect animated:YES];
    }
    

    请注意,我尽可能地抽象最终滚动操作.'ve used the convenient UIScrollView' s scrollRectToVisible函数 .

相关问题