iOS 8中UIKeyboardWillShowNotification事件的动画视图

时间:2014-10-20 13:51:39

标签: ios animation notifications keyboard ios8

我正在使用以下代码根据键盘移动为视图的位置设置动画。代码在iOS 7下工作正常,但它会在iOS 8下引起奇怪的行为:

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

- (void) keyboardWillShow:(NSNotification*) aNotification {  
    NSDictionary* keyboardInfo = [aNotification userInfo];
    NSTimeInterval time = [keyboardInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    UIViewAnimationCurve curve = [keyboardInfo[UIKeyboardAnimationCurveUserInfoKey] intValue];
    CGRect keyboardFrameEnd = [[keyboardInfo valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    double offset = keyboardFrameEnd.size.width > keyboardFrameEnd.size.height ? keyboardFrameEnd.size.height : keyboardFrameEnd.size.width;

    [UIView beginAnimations:@"moveWindow" context:nil];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationCurve:curve];
    [UIView setAnimationDuration:time];

    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y + offset, self.frame.size.width, self.frame.size.height);

    [UIView commitAnimations];
}

不幸的是,Is there a change to the behaviour of UIKeyboardWillShowNotification in iOS 8?iOS8: What's going on with moving views during keyboard transitions?中提到的答案是不可能的:

  • 源代码库非常大且不使用故事板或自动布局功能。
  • 我不想使用UIKeyboardDidShowNotification事件,因为键盘已经可见并且动画看起来很糟糕(但是,使用这种类型的通知时问题就消失了。)

奇怪的是,我发现当在应用程序的第一个屏幕中使用该功能时,问题就消失了。进一步的测试表明,从之前的一个屏幕中删除MKMapView可以解决这个问题。我三重检查MKMapView是否正确使用和处理。在执行上述代码之前,每个已分配的实例都已消失。

经过数小时的测试和调试后,我注意到在可视化层次结构调试器(How do I inspect the view hierarchy in iOS?)中,UILayoutContainerViewUINavigationTransitionView下添加了约束。从前一个屏幕中删除MKMapView控件时,不存在这些约束。我尝试使用setTranslatesAutoresizingMaskIntoConstraints:设置的所有可能组合进行播放,但尚未找到任何解决方案。这是iOS 8中的某种错误,还是有另一种方法可以在键盘上制作动画?

1 个答案:

答案 0 :(得分:0)

我不确定代码本身,但是关于那些动画方法的文档...

  

在iOS 4.0及更高版本中不鼓励使用此方法。您应该使用基于块的动画方法来指定动画。

为视图设置动画的正确方法是......

[UIView animateWithDuration:time
                      delay:0
                    options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^{
                     self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y + offset, self.frame.size.width, self.frame.size.height);
                 }
                 completion:nil];

修改

好吧,这不是AutoLayout(我想)但是我会留在这里,因为你需要改变它,我会等待问题的更多信息。