【问题标题】:Dismiss keyboard with view simultaneously同时关闭带有视图的键盘
【发布时间】:2014-09-24 02:14:19
【问题描述】:

我正在构建的应用程序有一个消息/聊天视图控制器,它有一个带有 textView 的视图和一个位于视图底部的按钮(标签栏设置为隐藏)。当视图加载时,其中包含这些对象(textView 和按钮)的视图位于屏幕的底部(就像您进入对话时它在 iMessage 应用程序中的外观一样)

现在,当点击 textview 时,显然键盘会向上移动,与此同时,我设法让视图向上移动并直接坐在键盘顶部(就像你输入一个新的短信)。

现在我要做的是让视图通过键盘上下移动。截至目前,它从底部开始。当键盘升起时,该视图会在底部停留一两秒钟,然后仅出现在键盘上方。键盘关闭时也是如此。

我希望我能提供图片,但我想我的名声不太好

有没有一种方法可以匹配两者的过渡或动画,使它们像连接一样一起移动?

视图已初始化

//Create the keyboard UIView
    self.keyboardView =  [[UIView alloc] initWithFrame:CGRectMake(0, self.view.frame.origin.y + self.view.frame.size.height - (self.navigationController.tabBarController.tabBar.frame.size.height), self.view.frame.size.width, 50)];

用于移动视图的选择器

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardFrameDidChange:) name:UIKeyboardDidChangeFrameNotification object:nil];

选择器实现

- (void)keyboardFrameDidChange:(NSNotification*)notification{
    NSDictionary* info = [notification userInfo];

    CGRect kKeyBoardFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
        [self.keyboardView setFrame:CGRectMake(0, kKeyBoardFrame.origin.y - self.keyboardView.frame.size.height, 320, self.keyboardView.frame.size.height)];
        self.myScrollView.contentSize = CGSizeMake(self.view.frame.size.width, self.myTableView.frame.size.height);


}

【问题讨论】:

    标签: ios ios7 ios8 xcode6


    【解决方案1】:

    你可以在这里做的是键盘通知

    [[NSNotificationCenter defaultCenter] addObserver:self
    
                                             selector:@selector(keyboardWasShown:)
    
                                                 name:UIKeyboardWillShowNotification object:nil];
    
    [[NSNotificationCenter defaultCenter] addObserver:self
    
                                             selector:@selector(keyboardWillBeHidden:)
    
                                                 name:UIKeyboardWillHideNotification object:nil];
    

    keyboardWasShown

    - (void)keyboardWasShown:(NSNotification*)aNotification
    
    {
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    double duration = [[[aNotification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    int curve = [[[aNotification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue];
    [UIView beginAnimations:@"foo" context:nil];
    [UIView setAnimationDuration:duration];
    [UIView setAnimationCurve:curve];
    CGRect rect=self.viewChatWindow.frame;
    rect.size.height=self.viewChatWindow.frame.size.height-kbSize.height;
    self.viewChatWindow.frame=rect;
    
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(scrollToLast)];
    [UIView commitAnimations];
    
    }
    

    keyboardWillBeHidden

    - (void)keyboardWillBeHidden:(NSNotification*)aNotification
    
    {
    double duration = [[[aNotification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    int curve = [[[aNotification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue];
    [UIView beginAnimations:@"foo" context:nil];
    [UIView setAnimationDuration:duration];
    [UIView setAnimationCurve:curve];
    CGRect rect=self.viewChatWindow.frame;
    rect.size.height=self.view.frame.size.height-rect.origin.y;
    self.viewChatWindow.frame=rect;
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(scrollToLast)];
    [UIView commitAnimations];
    }
    

    【讨论】:

      【解决方案2】:

      只需将您的 [keyboardView setFrame:...] 包装在动画块中即可。您可以从通知对象中获取键盘的动画时长和曲线:

      NSTimeInterval duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
      UIViewAnimationCurve curve = [notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue];
      [UIView animateWithDuration:duration delay:0 options:curve animations:^{
          self.keyboardView.frame = ...;
      } completion:nil];
      

      【讨论】:

      • 如果我用这个方法来关闭键盘怎么办self.myScrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
      • 嗯,好问题。我对 UIScrollViewKeyboardDismissModeInteractive 不是很熟悉。看起来这可能是 stackoverflow.com/questions/19118921/… 的副本。您是否尝试过那里描述的解决方案?
      • 我已经尝试过了,如果我用它的自然动画来关闭键盘,它就可以完美地工作。所以谢谢你!
      【解决方案3】:

      使用 UITextFieldDelegate

      这将是你的键盘将出现的标志

      -(void)textFieldDidBeginEditing:(UITextField *)textField{
      //Animate like slide up.
              [UIView animateWithDuration:0.3
                               animations:^{
                                   //Use offset rather than contentSize
                                   scrollView.contentOffset = CGPointMake(x,y);
                               }];
      }
      

      当您的键盘被关闭时 (resignFirstResponder)

      -(void)dismissKeyboard{
          [self.view endEditing:YES];
          [UIView animateWithDuration:0.3
                           animations:^{
                               scrollView.contentOffset = CGPointMake(0,0);
      
                           }];
       }
      

      【讨论】:

      • 但是我正在使用 textView...如果我使用的是文本字段,这不是很理想吗?
      • 我认为这与 textview 相同,但 UITextViewDelegate 代替。
      猜你喜欢
      • 1970-01-01
      • 2017-01-22
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多