如何将过渡添加到viewWillTransitionToSize

时间:2018-07-03 20:27:43

标签: ios core-animation screen-rotation

我正在用iPhone和iPad的Objective-C进行开发,目前在iOS11上并且没有使用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例程中的位置,但是我尝试过的任何位置都无济于事。我有种种感觉,我错了。

1 个答案:

答案 0 :(得分:0)

经过一些实验,我已经解决了这个问题。

在每个视图控制器中,我添加了一个附加的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的正确运行,这些都不是必需的,但是当用户从一个视图控制器移动到下一个视图控制器并旋转设备时,它确实会产生我喜欢的效果。