我正在使用以下代碼根據鍵盤移動爲視圖的位置設置動畫。該代碼的iOS 7下正常工作,但它引起的iOS 8下奇怪的現象:iOS 8中UIKeyboardWillShowNotification事件動畫視圖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本身的某種錯誤,或者是否有另一種方式來與鍵盤一起製作動畫視圖?
你可以在你創建視圖的位置顯示一些代碼。特別是當你「開始工作」時你正在改變的代碼。 – Fogmeister 2014-10-20 14:00:35