簡體   English   中英

如何將過渡添加到viewWillTransitionToSize

[英]How to add a transition to viewWillTransitionToSize

我目前在iOS11上針對iPhone和iPad使用Objective-C進行開發,未使用Interface Builder。

我正在使用viewWillTransitionToSize處理設備旋轉。

我希望在旋轉開始時呈現的UI逐漸淡出為黑色,並且當新旋轉的UI穩定時,我希望新UI逐漸漸入。總的漸出/漸入過渡時間為大約是1/2秒。

我已經討論過可以將過渡與viewWillTransitionToSize集成在一起的討論,但是我還沒有看到示例,並且我在為如何做自己想做的事情而苦苦掙扎。

我編寫了以下代碼,使旋轉過渡更加平滑。 但這距離我想要實現的目標還有很長的路要走:

- (void)  viewWillTransitionToSize: (CGSize) size
         withTransitionCoordinator: (id)     cord
   {
   [super viewWillTransitionToSize: size withTransitionCoordinator: cord];

   void (^midRotationBlk)(id) = ^(id cntx)
      {
      [gU updDevDirOrient: size];
      [self calcScrnCntAndScrollSize]; // recalculates horz scroll size
      [self updateViewConstraints];
      [[[self view] layer] addAnimation: [gU getTransitionEaseInOut: 0.5f]
                                 forKey: nil];
      };

   void (^endRotationBlk)(id) = ^(id cntx)
      {
      [self doScrollToPage: [self prevScrollPage]];
      };

   [cord animateAlongsideTransition: midRotationBlk
                         completion: endRotationBlk];
   }

對getTransitionEaseInOut的調用如下所示:

- (CATransition *) getTransitionEaseInOut: (float) secs;
   {
   CATransition * transition = [CATransition animation];

   [transition       setDuration: secs];
   [transition setTimingFunction: [CAMediaTimingFunction
                functionWithName: kCAMediaTimingFunctionEaseInEaseOut]];
   [transition           setType: kCATransitionFade];

   return( transition );
   }

我已經嘗試過將對addAnimation的調用放在viewWillTransitionToSize例程中的位置,但是我嘗試過的任何位置都沒有真正幫助。 我有種種感覺,我錯了。

經過一些實驗,我已經解決了這個問題。

在每個視圖控制器中,我都添加了一個附加的UIView。 它的大小可以覆蓋整個物理屏幕。 它始終是最后添加的視圖,因此涵蓋了它下面的所有其他詳細信息。 它的顏色設置為與視圖控制器現有背景顏色相同的顏色。 我在下面的代碼中將此視圖稱為“ ovrView”。

在入口處,在viewWillAppear的視圖控制器中,我添加了以下代碼:

   ovrView.alpha = 1.0f;
   [UIView animateWithDuration: 0.2f
                    animations: ^{ ovrView.alpha = 0.0f; }];

這樣做的效果是,每當我進入視圖控制器時,都會向用戶顯示空白的背景色字段,並且此疊加層在顯示以下詳細信息0.2秒后消失。

在每個視圖控制器的viewWillTransitionToSize例程中,我添加了以下代碼:

- (void)  viewWillTransitionToSize: (CGSize) newSize
         withTransitionCoordinator: (id)     coordinator
   {
   //...this code executes before the rotation.

   [super  viewWillTransitionToSize: newSize 
          withTransitionCoordinator: coordinator];

   ovrView.alpha = 1.0f;

   void (^midRotationBlk)(id) = ^(id context)
      {
      //...this code executes during the rotation.

      [self updateViewConstraints];
      };

   void (^endRotationBlk)(id) = ^(id context)
      {
      //...this code executes after the rotation.

       [UIView animateWithDuration: 0.4f
                       animations: ^{ ovrView.alpha = 0.0f; }];
     };

   [coordinator animateAlongsideTransition: midRotationBlk
                                completion: endRotationBlk];
   }

此代碼的作用是,在旋轉開始之前屏幕變為空白背景色,然后在旋轉結束后清除以顯示旋轉后細節。

我嘗試在旋轉開始時淡入ovrView,而不是立即將其alpha設置為1.0f。 但是,我總是可以在淡入動畫下看到旋轉開始,所以我放棄了它。

對於App的正確運行,這些都不是必需的,但是當用戶從一個視圖控制器移動到下一個視圖控制器並旋轉設備時,它確實會產生我喜歡的效果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM