使用UIStatusBarAnimation进行UIViewControllerAnimatedTransitioning

时间:2014-07-07 15:26:08

标签: ios objective-c animation uistatusbar

我在ViewController A中实现了该方法

- (BOOL)prefersStatusBarHidden {
  return NO;
}

我在ViewController B中实现了该方法

- (BOOL)prefersStatusBarHidden {
  return YES;
}

- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation {
  return UIStatusBarAnimationSlide; // when doing hiding animation i want it to slide up
}

我实现了一个类T,它符合viewController转换说AtoBTransition,我用这个ViewControllerTransition转换为vc(viewcontroller)A到vc B. when transitioning to vc B i want the status bar to slide up (hide with sliding animation)但在这种情况下,它似乎没有那样做滑动动画。

问题:只是假设我没有在课程T中执行UIStatusBar相关代码,并且没有在信息plist中添加值View controller-based status bar appearance。转换T可以根据需要完美运行。

  1. 我确定代码通过执行断点或日志记录来读取-preferredStatusBarUpdateAnimation,但为什么它没有通过滑动隐藏状态栏动画?当我在模拟器中切换到慢动作。看来它不会做动画。

  2. 我的理论是它与转换动画上下文冲突,所以是否有可能在T的实现中隐藏UIStatusBar作为其过渡方案的一部分?

  3. 是否可以与ViewControllerAnimationTransition一起进行UIStatusBar动画?

  4. 随意清除一些东西。提前谢谢.. :)

1 个答案:

答案 0 :(得分:1)

我认为您无法直接使用iOS 7的视图控制器转换API执行此操作。

现在,我假设基于此API和状态栏API的钩子,状态栏本身就是动物,并且无法通过自定义转换进行动画制作。我认为是这种情况,因为当为您创建UIViewControllerContextTransitioning transitionContext时,视图控制器A已经添加到它containerView,并且因为您负责将视图控制器B添加到containerView(因为您需要转换到它)所有视图控制器B的状态栏操作方法都会被触发。

但是,您可以在动画过渡期间为UIApplication keyWindow的{​​{1}}框架设置动画。所以在-animateTransition:方法中你的类实现了UIViewControllerAnimatedTransitioning

[UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{

    [UIApplication sharedApplication].keyWindow.frame = CGRectMake(0, 0, 320, 568);  // move frame up

} completion:^(BOOL finished) {

    // assuming 
    [UIApplication sharedApplication].keyWindow.frame = CGRectMake(0, 20, 320, 568); //move frame down
}];

如果采用这种方法,您可能需要在视图控制器A中调整关键窗口的框架以降至状态栏下方,并根据需要设置为浅色/深色。然后反过来在视图控制器B中获得你想要的效果。它很讨厌,但它可以工作。