我正在使用以下代码根据键盘移动为视图的位置设置动画。代码在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?)中,UILayoutContainerView
和UINavigationTransitionView
下添加了约束。从前一个屏幕中删除MKMapView
控件时,不存在这些约束。我尝试使用setTranslatesAutoresizingMaskIntoConstraints:
设置的所有可能组合进行播放,但尚未找到任何解决方案。这是iOS 8中的某种错误,还是有另一种方法可以在键盘上制作动画?
答案 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(我想)但是我会留在这里,因为你需要改变它,我会等待问题的更多信息。