4

我有两个简单的 UIViewControllers,它们的视图是 320 x 460 的状态栏。我在 AppDelegate 做

self.window.rootViewController = [[[SimpleController alloc] init] autorelease];

[self.window makeKeyAndVisible];

在 SimpleController 我有一个按钮

- (IBAction) switchToVerySimpleController
{
  [UIView transitionWithView: [[UIApplication sharedApplication] keyWindow]
                    duration: 0.5
                     options: UIViewAnimationOptionTransitionFlipFromLeft
                  animations:^{ [[UIApplication sharedApplication] keyWindow].rootViewController = [[[VerySimpleController alloc] init] autorelease]; }
                  completion: NULL];
}

新视图 (VerySimpleController.view) 用蓝色填充。动画后,新视图的底部会显示一条细小的白色条纹(状态栏大小),然后它会向下跳到位。为什么会发生这种情况以及如何避免这种情况?我想应该归咎于它的状态栏,我试图在 IB 中为这两个视图设置 statusBar = Unspecified,但这没有帮助。

更新:当我从一开始就隐藏状态栏(通过 .info 文件中的设置)时,不会发生视图调整。但仍然......我需要显示 statusBar 并且我需要该动画正常工作。

4

2 回答 2

2

当一个 rootViewController 被分配给一个窗口时,如果一个状态栏存在,一个新的框架被分配给 rootViewController 的视图。这样rootViewController 的视图就不会隐藏在状态栏下。

由于您在动画块内设置了窗口的 rootViewController,因此新的帧分配也会被动画化。

为了不显示跳转,您可以在动画之前设置 rootViewController 视图的框架,如下所示:

- (IBAction) switchToVerySimpleController
{
    CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];

    VerySimpleController *vsc = [[[VerySimpleController alloc] init] autorelease];

    vsc.view.frame = CGRectMake(vsc.frame.origin.x,
                     statusBarFrame.size.height,
                     vsc.frame.size.width,
                     vsc.frame.size.height);

    [UIView transitionWithView: [[UIApplication sharedApplication] keyWindow]
                      duration: 0.5
                       options: UIViewAnimationOptionTransitionFlipFromLeft
                    animations:^{ [[UIApplication sharedApplication] keyWindow].rootViewController = vsc }
                    completion: NULL];
}
于 2013-05-26T18:01:49.517 回答
0

似乎这个问题有时仍然会发生,这可能是一个错误。

为了避免这种“跳转”,将此代码添加到viewWillAppear需要显示的视图控制器的方法中:

迅速

navigationController?.navigationBar.layer.removeAllAnimations()

目标-c

[self.navigationController.navigationBar.layer removeAllAnimations];

过渡现在将在没有“跳转”的情况下完成。

于 2016-12-01T14:16:10.970 回答