2014-10-20 22 views
3

我正在使用以下代碼根據鍵盤移動爲視圖的位置設置動畫。該代碼的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?)中,在UILayoutContainerViewUINavigationTransitionView下添加了約束條件。從前一個屏幕中刪除MKMapView控件時,這些約束不存在。我試着玩setTranslatesAutoresizingMaskIntoConstraints:設置的每種可能的組合,並且還找不到任何分辨率。它是否是iOS 8本身的某種錯誤,或者是否有另一種方式來與鍵盤一起製作動畫視圖?

+0

你可以在你創建視圖的位置顯示一些代碼。特別是當你「開始工作」時你正在改變的代碼。 – Fogmeister 2014-10-20 14:00:35

回答

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]; 

編輯

OK,這不是自動版式(我認爲),但我會在這裏反正離開這個你需要改變它,我會等待問題中的更多信息。