Представление «прыгает», когда я добавляю его в UIWindow как подпредставление (через свойство rootViewController) и делаю переворот - PullRequest
4 голосов
/ 29 апреля 2011

У меня есть два простых 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 = Unspecified в IB для обоих представлений, но это не помогает.

ОБНОВЛЕНИЕ: Когда я скрываю statusBar (через установку в файле .info) изначало, никакой настройки просмотра не происходит.Но все же ... Мне нужно показать statusBar, и мне нужно, чтобы эта анимация работала правильно.

Ответы [ 2 ]

2 голосов
/ 26 мая 2013

Когда 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];
}
0 голосов
/ 01 декабря 2016

Кажется, что эта проблема все еще иногда возникает, и это, вероятно, ошибка.

Чтобы избежать этого «скачка», добавьте этот код в метод viewWillAppear контроллера представления, который должен быть показан:

swift

navigationController?.navigationBar.layer.removeAllAnimations()

goal-c

[self.navigationController.navigationBar.layer removeAllAnimations];

Переход завершится без «прыжка».

...