2013-10-22 21 views
3

我有一種方法來執行一個小動搖動畫。這個動畫有點作用,但每次我從風景位置調用它時,它都會旋轉。當模擬器處於橫向模式時調用動畫時,整個視圖將自身旋轉爲縱向,然後執行動畫。旋轉本身不是動畫的,它只是突然改變而沒有延遲。在視圖轉變一切還有,所有的按鈕,文本域,圖像視圖等搖動動畫旋轉顯示以及動畫

動畫代碼:

- (void)shakeView 
{ 
    CGFloat t = 8.0; 
    CGAffineTransform translateRight = CGAffineTransformTranslate(CGAffineTransformIdentity, 0.0, t); 
    CGAffineTransform translateLeft = CGAffineTransformTranslate(CGAffineTransformIdentity, 0.0, -t); 

    self.view.transform = translateLeft; 

    [UIView animateWithDuration:0.07 delay:0.0 options:UIViewAnimationOptionAutoreverse|UIViewAnimationOptionRepeat animations:^{[UIView setAnimationRepeatCount:3.0]; 

     self.view.transform = translateRight; 
    } 
     completion:^(BOOL finished){ 
     if (finished) 
      { 
       [UIView animateWithDuration:0.05 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{self.view.transform = CGAffineTransformIdentity; 
      } 
     completion:NULL]; 
     } 
    }]; 
} 

老實說,我沒有做很多與動畫,所以我不知道是什麼我在這裏做錯了,更不用說我應該嘗試什麼,或者我應該在哪裏尋找答案。

我期待保持動畫,同時也保持方向。

+0

我沒有看到任何問題..它完全正常工作...有可能是在你的代碼的其他部分的問題。 –

+0

@Xman,你在風景中運行動畫嗎?當模擬器處於橫向模式時,我的整個UIView,所有按鈕,文本字段和圖像視圖都會翻轉成肖像。 – CaptJak

+0

我在兩種模式下運行它.. –

回答

1

問題是視圖已經有一個非標識轉換。爲了使視圖在橫向上正確顯示,系統會對其旋轉視圖進行變換。只有當設備位於UIDeviceOrientationPortrait中時,視圖的轉換纔是CGAffineTransformIdentity。此方向旋轉僅適用於應用程序的根子節點,即窗口的第一個子視圖。當你與你的初始化翻譯動畫:

CGAffineTransform translateRight = CGAffineTransformTranslate(CGAffineTransformIdentity, 0.0, t); 

你告訴旋轉視圖忽略它的旋轉和彈回其在縱向模式方向。您可以通過執行以下任一操作來解決此問題:

  1. 使動畫視圖成爲根視圖的子視圖。這有一個好處,系統仍然可以處理旋轉,並且沒有任何機會讓您的動畫搞亂方向變化。此外,代碼將更簡單並且更容易維護。

  2. 存儲視圖的初始轉換,並對其應用所有轉換。

我會盡力在這裏做#2。

- (void)shakeView 
{ 
    CGFloat t = 8.0; 

    //store the initial transform and use it to create the animated transforms 
    CGAffineTransform initialTransform = self.view.transform; 
    CGAffineTransform translateRight = CGAffineTransformTranslate(initialTransform, 0.0, t); 
    CGAffineTransform translateLeft = CGAffineTransformTranslate(initialTransform, 0.0, -t); 

    self.view.transform = translateLeft; 

    [UIView animateWithDuration:0.07 
          delay:0.0 
         options:UIViewAnimationOptionAutoreverse|UIViewAnimationOptionRepeat 
        animations:^{ 
     [UIView setAnimationRepeatCount:3.0]; 

     self.view.transform = translateRight; 
           } 
        completion:^(BOOL finished){ 
     if (finished) 
     { 
      [UIView animateWithDuration:0.05 
            delay:0.0 
           options:UIViewAnimationOptionBeginFromCurrentState 
          animations:^{ 
       //restore the initial transform 
       self.view.transform = initialTransform; 
             } 
          completion:NULL]; 
     } 
    }]; 
} 

- 作爲iOS 8的時,一個UIWindow的根視圖不再轉化上轉動。相反,UIWindow的邊界本身就會改變。關於這個問題的另一個問題,請看這裏:UIWindow frame in ios 8 different from ios 7 in Landscape