2013-10-07 118 views
0

我有一个具有文本字段的视图。还配置了键盘以完成按钮以隐藏键盘。我已将代理附加到我的txtfield,以便在显示键盘时向上滚动。它的工作正常,但当我点击完成隐藏键盘,视图保持滚动和用户不得不手动向后滚动它..任何想法/指针如何解决此问题..如何在隐藏键盘时向下滚动视图

以下是我的代码以实现滚动功能..

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    keyboardIsShown = NO; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow:) 
               name:UIKeyboardWillShowNotification 
               object:self.view.window]; 
    // register for keyboard notifications 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillHide:) 
               name:UIKeyboardWillHideNotification 
               object:self.view.window]; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 

    [super viewDidDisappear:animated]; 

    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:UIKeyboardWillShowNotification 
                object:nil]; 

    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:UIKeyboardWillHideNotification 
                object:nil]; 
} 


- (void)keyboardWillShow:(NSNotification *)n 
{ 
    if (keyboardIsShown) { 
     return; 
    } 

    NSDictionary* userInfo = [n userInfo]; 

    // get the size of the keyboard 
    CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    // resize the noteView 
    CGRect viewFrame = self.scrollView.frame; 
    // I'm also subtracting a constant kTabBarHeight because my UIScrollView was offset by the UITabBar so really only the portion of the keyboard that is leftover pass the UITabBar is obscuring my UIScrollView. 
    viewFrame.size.height -= (keyboardSize.height - kTabBarHeight); 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    // The kKeyboardAnimationDuration I am using is 0.3 
    [UIView setAnimationDuration:kKeyboardAnimationDuration]; 
    [self.scrollView setFrame:viewFrame]; 
    [UIView commitAnimations]; 

    scrollView.contentSize = formView.frame.size; 


    keyboardIsShown = YES; 
} 

- (void)keyboardWillHide:(NSNotification *)n 
{ 
    NSDictionary* userInfo = [n userInfo]; 

    // get the size of the keyboard 
    CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 


    // resize the scrollview 
    CGRect viewFrame = self.scrollView.frame; 
    // I'm also subtracting a constant kTabBarHeight because my UIScrollView was offset by the UITabBar so really only the portion of the keyboard that is leftover pass the UITabBar is obscuring my UIScrollView. 
    viewFrame.size.height += (keyboardSize.height - kTabBarHeight); 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    // The kKeyboardAnimationDuration I am using is 0.3 
    [UIView setAnimationDuration:kKeyboardAnimationDuration]; 
    [self.scrollView setFrame:viewFrame]; 
    [UIView commitAnimations]; 

    keyboardIsShown = NO; 
} 
+1

你可以通过删除所有这样注册的观察者来缩短代码: [[NSNotificationCenter defaultCente r] removeObserver:self]; –

回答

0

合并如果你只是想回动画顶部滚动。

-(void)keyboardWillHide:(NSNotification *)notification { 
     UIEdgeInsets contentInsets = UIEdgeInsetsZero; 
     CGPoint top = CGPointMake(0, 0); 
     [self.scrollView setContentOffset:top animated:YES]; 
     self.scrollView.scrollIndicatorInsets = contentInsets; 
} 

不需要在上面实现的keyboardIsShown实例变量

+0

谢谢@kyle C ..我添加了CGPoint top = CGPointMake(0,-65);和它的工作。希望Y坐标的硬编码不会产生任何问题?任何建议plz。 –

0

试试这个:

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, 216, 0.0); 
    self.scrollView.contentInset = contentInsets; 
    self.scrollView.scrollIndicatorInsets = contentInsets; 
    CGRect frame = CGRectMake(0, textFieds.frame.origin.y + kOtherViewsHeightWhichMightNotBeInSameViewAsScrollView, 10, 10); 

    [self.scrollView scrollRectToVisible:frame] animated:YES]; 
} 

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField 
{ 
    UIEdgeInsets contentInsets = UIEdgeInsetsZero; 
    self.scrollView.contentInset = contentInsets; 
    self.scrollView.scrollIndicatorInsets = contentInsets; 
    return YES; 
} 

不要忘记设置您的视图控制器为您的文本字段

的代表
相关问题