【问题标题】:How to add a transition to viewWillTransitionToSize如何向 viewWillTransitionToSize 添加过渡
【发布时间】:2018-07-03 20:27:42
【问题描述】:

我正在为 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 );
   }

我已经尝试过在 viewWillTransitionToSize 例程中调用 addAnimation 的位置,但我尝试过的所有位置都没有真正有帮助。我觉得我做错了。

【问题讨论】:

    标签: ios core-animation screen-rotation


    【解决方案1】:

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

    在我的每个视图控制器中,我都添加了一个额外的 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。但是,我总是可以看到在淡入动画下开始旋转,所以我放弃了它。

    对于应用程序的正确运行而言,这些都不是必需的,但它确实会产生我喜欢的效果,因为用户从一个视图控制器移动到下一个视图控制器以及旋转设备时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 2022-08-20
      • 2017-10-06
      相关资源
      最近更新 更多