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



我有两个简单的uiviewcontroller,他们的视图是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)被填充为蓝色。动画完成后,新视图会在底部显示一条白色的小条纹(和状态栏一样大),然后它会跳到合适的位置。为什么会发生这种情况?如何避免这种情况?我想它的状态栏的责任,我试图设置statusBar =未指定在IB的两个视图,但它没有帮助。

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

当一个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];
}

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

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

迅速

navigationController?.navigationBar.layer.removeAllAnimations()
objective - c

[self.navigationController.navigationBar.layer removeAllAnimations];

现在将完成过渡,没有'jump'。

最新更新