Должен ли я использовать PresentModalViewController? - PullRequest
0 голосов
/ 19 августа 2011

Я делаю некоторые "интересные" переходы между представлениями и обнаруживаю, что работаю над функционалом "presentModalViewController", что выглядит неправильно.

Я бы предпочел взять полный контроль над представлением представления модального контроллера и вообще пропустить «presentModalViewController».

Однако я не уверен в последствиях этого.

В настоящее время у меня есть код, который выглядит примерно так (это просто пример псевдокода, и я не могу использовать встроенные переходы, они не будут делать то, что мне нужно):

    // Create the child view controller:
    ModalViewController * child = [[ModalViewController alloc] init];

    // Present it:
    [parentViewController presentModalViewController:child animated:NO];

    // This rect is what the child view's ultimate "destination" should be,
    // and, what the parent view's old frame was:
    CGRect frame = child.view.frame;

    // Put the parent view controller's view back in the window:
    [child.view.window insertSubview:parentViewController.view belowSubview:child.view];

    // Show it if it's hidden:
    [parentViewController.view setHidden:NO];

    // Put the parent back where it was:
    [parentViewController.view setFrame:frame];

    // Put the child at the "top" of the screen (the bottom edge
    // of the child's view is at the top of the screen):
    [child.view setFrame:CGRectMake(frame.origin.x, 
                                  frame.origin.y - frame.size.height, 
                                  frame.size.width, 
                                  frame.size.height)];

    // Animate a transition which slide the parent and child views 
    // down together:
    [UIView animateWithDuration:0.7 animations:^(void) {

        child.view.frame = frame;
        parentViewController.view.frame = CGRectMake(frame.origin.x, 
                                    frame.origin.y + frame.size.height, 
                                    frame.size.width, 
                                    frame.size.height);

    } completion:^(BOOL finished) {
        // We're done, remove the parent view from the window
        // like it's supposed to be:
        [parentViewController.view removeFromSuperview]; 
    }];

    [child release];

1 Ответ

1 голос
/ 19 августа 2011

Если вы не хотите, чтобы UIKit устанавливал modalViewController и управлял представлением и удалением дочернего контроллера представления, то не делайте этого. Вы можете пропустить вызов presentModalViewController:animated: и вручную добавить или удалить подпредставления, или, если вы хотите переключиться на совершенно новый контроллер представления, затем отключить старый view от иерархии, подключить новый и т. Д. Другие способы представления включают UINavigationController или UITabBarController, и они не используют методы modalViewController.

Чтобы быть более точным, вы должны установить свойство rootViewController вашего приложения UIWindow для нового контроллера представления.

Документы говорят:

Контроллер корневого представления обеспечивает представление содержимого окна. Назначение контроллера представления этому свойству (программно или с помощью Interface Builder) устанавливает представление контроллера представления в качестве представления содержимого окна. Если окно имеет существующую иерархию представлений, старые представления удаляются до установки новых.

Обратите внимание, что в документах упоминается автоматический процесс установки view в качестве представления содержимого иерархии. Я хочу сказать, что вы можете использовать предоставленные автоматические методы - UIWindow для корневых представлений, modalViewController и другие системы для некорневых представлений - или вы можете сделать это вручную, но это выполняет то же самое. Тем более что свойство rootViewController существует только с iOS 4, и приложения до этого использовали автоматически сгенерированный код по умолчанию [window addSubview:rootView] при запуске.

Если в UIKit есть какая-то дополнительная магия, возникающая в [UIWindow setRootViewController:], я полностью готов исправить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...