移动视图同时重置框架和键盘

时间:2014-09-23 12:00:06

标签: ios keyboard-events objectoutputstream

我有查看键入消息,如下所示。

enter image description here

现在,当我键入消息时,键盘出现,框应该在键盘上方移动,如下图所示。

enter image description here

我的问题  他们键盘动画和视图动画发生在不同的时间。键盘首先出现,然后出现视图。即使我试图将动画时间设置为任何时间,它们也会在不同的时间发生。

我该如何解决我的问题?

请建议我解决它的方法,以便键盘和视图动画显示它们是相同的视图。两个动画都应该在准确的时间出现,以便它们看起来像一次出现的相同视图。

我尝试了什么

我的观点确实加载了以下代码

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

现在键盘显示功能看起来像

- (void)keyboardWillShow:(NSNotification *)note{
  NSDictionary* keyboardInfo = [note userInfo];
  CGFloat duration = [[keyboardInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];
[UIView animateWithDuration:duration animations:
 ^{
   //chat_typingView is name for typing view
   chat_typingView.frame = CGRectMake(chat_typingView.frame.origin.x,
                                                238,
                                                chat_typingView.frame.size.width,
                                                chat_typingView.frame.size.height);
 }

2 个答案:

答案 0 :(得分:0)

也许你应该在做动画之前检查你的chat_typinfView是否是第一响应者并禁用Autolayout(非常重要)。

if ([chat_typingView isFirstResponder]) {
  // Do the animation 
}

PS建议订阅viewWillApper上的通知而不是viewDidLoad

答案 1 :(得分:0)

我在其中一个应用中有类似的设置,我会执行以下操作:

- (void)viewDidLoad
{
    [super viewDidLoad];

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

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardHidden:)
                                                 name:UIKeyboardWillHideNotification object:nil];
}

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    /*** FOR AUTOLAYOUT MODIFICATIONS & ADDITIONS @ RUNTIME ***/

    self.defaultViewFrame = self.myView.frame
}


- (void) keyboardShowed:(NSNotification*)notification {

    //GET KEYBOARD FRAME
    CGRect keyboardFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    //CONVERT KEYBOARD FRAME TO MATCH THE OUR COORDINATE SYSTEM (FOR UPSIDEDOWN ROTATION)
    CGRect convertedFrame = [self.view convertRect:keyboardFrame fromView:self.view.window];

    //..... do something with the convertedFrame (in your case convertedFrame.origin.y)
}

- (void) keyboardHidden:(NSNotification*)notification {

    //RESTORE ORIGINAL STATE 

    [UIView transitionWithView:self.view
                      duration:.3f
                       options:UIViewAnimationOptionCurveLinear
                    animations:^{
                        self.myView.frame = self.defaultViewFrame;
                    }
                        completion:nil];
}