Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 键盘上方的空白区域隐藏文本字段_Ios_Objective C_Uiscrollview - Fatal编程技术网

Ios 键盘上方的空白区域隐藏文本字段

Ios 键盘上方的空白区域隐藏文本字段,ios,objective-c,uiscrollview,Ios,Objective C,Uiscrollview,当键盘出现时,我试图向上移动滚动视图时遇到问题。 在ios7中,滚动视图向上移动,但在ios6中,滚动视图不向上移动,并且键盘上方有额外的空白,隐藏了屏幕上的控件 我的代码: - (void)viewWillAppear:(BOOL)animated { [super viewDidAppear:animated]; keyboardIsShown = NO; [super viewWillAppear:animated]; [[self view] en

当键盘出现时,我试图向上移动滚动视图时遇到问题。 在ios7中,滚动视图向上移动,但在ios6中,滚动视图不向上移动,并且键盘上方有额外的空白,隐藏了屏幕上的控件

我的代码:

- (void)viewWillAppear:(BOOL)animated
{

    [super viewDidAppear:animated];
    keyboardIsShown = NO;



    [super viewWillAppear:animated];
    [[self view] endEditing:YES];

    [[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)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;
    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)keyboardWillShown:(NSNotification*)aNotification
{

    NSDictionary* info = [aNotification userInfo];
    CGSize beginSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    // keyboard will appear
    if(!_keyboardShowed) {
        _keyboardShowed = YES;
        [UIView animateWithDuration:0.4
                         animations:^{
                             CGFloat scrollHeight =_scrollView.size.height - (IS_PORTRAIT_ORIENTATION ? beginSize.height : beginSize.width);

                             CGRect scrollFrame = _scrollView.frame;
                             scrollFrame.size.height = scrollHeight;
                             _scrollView.frame = scrollFrame;
                         }
                         completion:^(BOOL finished){ }];
    }

    [self scrollToEditingTextField];

}

- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{

    NSDictionary* info = [aNotification userInfo];
    CGSize endSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

    // keyboard will disappear
    if(_keyboardShowed) {
        CGFloat scrollHeight =_scrollView.size.height + (IS_PORTRAIT_ORIENTATION ? endSize.height : endSize.width);

        CGRect scrollFrame = _scrollView.frame;
        scrollFrame.size.height = scrollHeight;
        _scrollView.frame = scrollFrame;
        _keyboardShowed = NO;
    }
}



-(void)scrollToEditingTextField {
    // find which text field is currently editing
    UITextField *editingTextFiled = [self editingTextField:self.thisView];

    if(editingTextFiled == nil)  return;    // text field didnt found

    CGPoint scrollPoint = [editingTextFiled convertPoint:CGPointMake(0, 0) toView:self.scrollView];
    scrollPoint.y -= 70;
    scrollPoint.x = 0;

    [_scrollView setContentOffset:scrollPoint animated:YES];

}

-(UITextField*)editingTextField:(UIView*)view
{
    if( ( [[view class] isSubclassOfClass:[UITextField class]] ||
         [[view class] isSubclassOfClass:[UITextView class]] ) &&
       [view isFirstResponder] ) {
        return (UITextField*)view;
    }
    for(UIView *subview in view.subviews ) {
        if([[subview class] isSubclassOfClass:[UISearchBar class]]) {
            return nil;
        }

        if( ( [[subview class] isSubclassOfClass:[UITextField class]] ||
             [[subview class] isSubclassOfClass:[UITextView class]] ) &&
           [subview isFirstResponder] ) {
            return (UITextField*)subview;
        }
    }

    // recursion
    for(UIView *subview in view.subviews ) {
        UITextField *textField = [self editingTextField:subview];
        if(textField) return textField;
    }
    return nil;
}

问题是,您只更改滚动视图的大小,但不告诉滚动视图滚动到文本字段

请查看我的方法滚动编辑文本字段,以便更好地理解

- (void)keyboardWillShown:(NSNotification*)aNotification
{

    NSDictionary* info = [aNotification userInfo];
    CGSize beginSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    // keyboard will appear
    if(!_keyboardShowed) {
        _keyboardShowed = YES;
        [UIView animateWithDuration:0.4
                         animations:^{
                             CGFloat scrollHeight =_scrollView.size.height - (IS_PORTRAIT_ORIENTATION ? beginSize.height : beginSize.width);

                             CGRect scrollFrame = _scrollView.frame;
                             scrollFrame.size.height = scrollHeight;
                             _scrollView.frame = scrollFrame;
                         }
                         completion:^(BOOL finished){ }];
    }

    [self scrollToEditingTextField];

}

- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{

    NSDictionary* info = [aNotification userInfo];
    CGSize endSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

    // keyboard will disappear
    if(_keyboardShowed) {
        CGFloat scrollHeight =_scrollView.size.height + (IS_PORTRAIT_ORIENTATION ? endSize.height : endSize.width);

        CGRect scrollFrame = _scrollView.frame;
        scrollFrame.size.height = scrollHeight;
        _scrollView.frame = scrollFrame;
        _keyboardShowed = NO;
    }
}



-(void)scrollToEditingTextField {
    // find which text field is currently editing
    UITextField *editingTextFiled = [self editingTextField:self.thisView];

    if(editingTextFiled == nil)  return;    // text field didnt found

    CGPoint scrollPoint = [editingTextFiled convertPoint:CGPointMake(0, 0) toView:self.scrollView];
    scrollPoint.y -= 70;
    scrollPoint.x = 0;

    [_scrollView setContentOffset:scrollPoint animated:YES];

}

-(UITextField*)editingTextField:(UIView*)view
{
    if( ( [[view class] isSubclassOfClass:[UITextField class]] ||
         [[view class] isSubclassOfClass:[UITextView class]] ) &&
       [view isFirstResponder] ) {
        return (UITextField*)view;
    }
    for(UIView *subview in view.subviews ) {
        if([[subview class] isSubclassOfClass:[UISearchBar class]]) {
            return nil;
        }

        if( ( [[subview class] isSubclassOfClass:[UITextField class]] ||
             [[subview class] isSubclassOfClass:[UITextView class]] ) &&
           [subview isFirstResponder] ) {
            return (UITextField*)subview;
        }
    }

    // recursion
    for(UIView *subview in view.subviews ) {
        UITextField *textField = [self editingTextField:subview];
        if(textField) return textField;
    }
    return nil;
}
考虑使用,它将使您的生活从长远来看更容易,即您不必再为不同的视图控制器实现相同的代码。使用iOS6和IOS7也很好。考虑使用,它将使你的生活从长远来看更容易,也就是说,你不必再为不同的视图控制器实现相同的代码。它还可以与iOS6和iOS7配合使用。