当我将它作为子视图(通过rootViewController属性)添加到UIWindow并进行翻转时,视图“跳跃”

时间:2011-04-29 10:04:39

标签: ios animation uiview uiwindow

我有两个简单的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,但它没有用。

更新: 当我从头开始隐藏statusBar(通过.info文件中的设置)时,不会进行视图调整。但仍然......我需要显示statusBar,我需要动画正常工作。

2 个答案:

答案 0 :(得分:2)

如果状态栏存在,则将rootViewController分配给窗口a new frame is assigned到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];
}

答案 1 :(得分:0)

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

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

迅速

navigationController?.navigationBar.layer.removeAllAnimations()

目标c

[self.navigationController.navigationBar.layer removeAllAnimations];

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