objective-c - tutorial - uiviewcontrolleranimatedtransitioning objective c




Переход UIViewController-цель-c (3)

У меня есть UIViewControllers A и B, они выделены в AppDelegate . Мне нужно применить переход к ним. Как их UIViews без перераспределения и замены UIViews ? Этот код вызывает мой UIBarButtonItem в UINavigationController :

[UIView transitionFromView:self.view  //UIViewController A
                           toView:appDelegate.secondViewController.view //UIViewController B
                           duration:0.5 
                           options:UIViewAnimationOptionTransitionFlipFromLeft   

Этот метод заменяет UIViews в моих UIViewControllers , и я могу их переправить или просто не знаю, как это сделать. Можете ли вы рассказать мне, как это сделать?


пытаться

UIViewController* controller1;
UIViewController* controller2;
[controller1 transitionFromViewController:controller1 toViewController:controller2 duration:0.5f options:0 animations:nil completion:nil];

или

если над навигатором-контроллером1, то

UINavigationController* nav;
[nav pushViewController:controller2 animated:YES];

Если вы находитесь в мире iOS 5 и хотите прыгать между различными контроллерами, вы можете захотеть использовать Containment View Controller . Или проверьте сессию 102 WWDC 2011 .

Просмотр содержимого контроллера в основном предполагает, что у вас есть контроллер родительского представления, который управляет навигацией между несколькими дочерними контроллерами. В вашем случае родительское представление будет одно с панелью навигации с кнопкой на нем.

Обновить:

Если вы преследуете сдерживание, вы можете создать контроллер родительского представления, в котором есть панель навигации с кнопкой на ней. Когда вы загружаете это представление, вы можете добавить первый дочерний вид. Таким образом viewDidLoad может выглядеть так:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // this is my model, where I store data used by my view controllers

    _model = [[MyModel alloc] init];

    // let's create our first view controller

    OneViewController *controller = [[OneViewController  alloc] initWithNibName:@"OneViewController"  bundle:nil];

    // pass it our model (obviously, `model` is a property that I've set up in my child controllers)

    controller.model = _model;

    // let's put the new child in our container and add it to the view

    [self addChildViewController:controller];
    [self configureChild:controller];
    [self.view addSubview:controller.view];
    [controller didMoveToParentViewController:self];

    // update our navigation bar title and the label of the button accordingly

    [self updateTitles:controller];
}

configureChild выполняет окончательную настройку. Для удобства у меня часто будет UIView, который я установил в IB (в данном случае, с именем childView ), который я использую для настройки фрейма, который выводит меня из мира ручного создания фреймов, но вы можете сделать это любым способом:

- (void)configureChild:(UIViewController *)controller
{
    // configure it to be the right size (I create a childView in IB that is convenient for setting the size of the views of our child view controllers)

    controller.view.frame = self.childView.frame;
}

Это действие, если вы касаетесь кнопки на панели навигации. Если вы находитесь в первом контроллере, настройте второй контроллер. Если вы находитесь во втором контроллере, настройте первый:

- (IBAction)barButtonTouchUpInside:(id)sender 
{
    UIViewController *currentChildController = [self.childViewControllers objectAtIndex:0];

    if ([currentChildController isKindOfClass:[OneViewController class]])
    {
        TwoViewController *newChildController = [[TwoViewController alloc] initWithNibName:@"TwoViewController"  bundle:nil];
        newChildController.model = _model;
        [self transitionFrom:currentChildController To:newChildController];
    }
    else if ([currentChildController isKindOfClass:[TwoViewController class]])
    {
        OneViewController *newChildController = [[OneViewController alloc] initWithNibName:@"OneViewController"  bundle:nil];
        newChildController.model = _model;
        [self transitionFrom:currentChildController To:newChildController];
    }
    else
        NSAssert(FALSE, @"Unknown controller type");

}

Это делает основной переход (включая различные вызовы, связанные с защитой):

- (void)transitionFrom:(UIViewController *)oldController To:(UIViewController *)newController
{    
    [self addChildViewController:newController];
    [self configureChild:newController];

    [self transitionFromViewController:oldController 
                      toViewController:newController
                              duration:0.5
                               options:UIViewAnimationOptionTransitionCrossDissolve
                            animations:^{
                                [self updateTitles:newController];
                            }
                            completion:^(BOOL finished){
                                [oldController willMoveToParentViewController:nil];
                                [oldController removeFromParentViewController];
                                [newController didMoveToParentViewController:self];
                            }];
}

Этот метод просто устанавливает заголовок в панели навигации в нашем родительском контроллере представления, на основе которого выбран ребенок. Он также устанавливает кнопку для ссылки на другой контроллер.

- (void)updateTitles:(UIViewController *)controller
{
    if ([controller isKindOfClass:[OneViewController class]])
    {
        self.navigationItemTitle.title = @"First View Controller";  // current title
        self.barButton.title = @"Two";                              // title of button to take me to next controller
    }
    else if ([controller isKindOfClass:[TwoViewController class]])
    {
        self.navigationItemTitle.title = @"Second View Controller"; // current title
        self.barButton.title = @"One";                              // title of button to take me to next controller
    }
    else
        NSAssert(FALSE, @"Unknown controller type");
}

Все это предполагает, что вы собираетесь создавать и уничтожать контроллеры при переходе между ними. Обычно я это делаю, но использую модельный объект для хранения своих данных, поэтому сохраняю любые данные, которые я хочу.

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

- (void)viewDidLoad
{
    [super viewDidLoad];

    // this is my model, where I store data used by my view controllers

    _model = [[MyModel alloc] init];

    // let's create our first view controller

    _controller0 = [[OneViewController  alloc] initWithNibName:@"OneViewController"  bundle:nil];
    _controller0.model = _model;
    [self addChildViewController:_controller0];
    [self configureChild:_controller0];
    [_controller0 didMoveToParentViewController:self];

    // let's create our second view controller

    _controller1 = [[OneViewController  alloc] initWithNibName:@"OneViewController"  bundle:nil];
    _controller1.model = _model;
    [self addChildViewController:_controller1];
    [self configureChild:_controller1];
    [_controller1 didMoveToParentViewController:self];

    // let's add the first view and update our navigation bar title and the label of the button accordingly

    _currentChildController = _controller0;
    [self.view addSubview:_currentChildController.view];
    [self updateTitles:_currentChildController];
}

- (void)transitionFrom:(UIViewController *)oldController To:(UIViewController *)newController
{    
    [self transitionFromViewController:oldController 
                      toViewController:newController
                              duration:0.5
                               options:UIViewAnimationOptionTransitionCrossDissolve
                            animations:^{
                                [self updateTitles:newController];
                            }
                            completion:^(BOOL finished){
                                _currentChildController = newController;
                            }];
}

- (IBAction)barButtonTouchUpInside:(id)sender 
{
    UIViewController *newChildController;

    if ([_currentChildController isKindOfClass:[OneViewController class]])
    {
        newChildController = _controller1;
    }
    else if ([_currentChildController isKindOfClass:[TwoViewController class]])
    {
        newChildController = _controller0;
    }
    else
        NSAssert(FALSE, @"Unknown controller type");

    [self transitionFrom:_currentChildController To:newChildController];

}

Я видел это в обоих направлениях, поэтому вы можете делать то, что работает для вас.


посмотрите пожалуйста. Вы в основном хотите реализовать UIViewController, которая является новой функцией в iOS5. Приведенная выше ссылка предоставляет некоторый код и ссылку на проект github.

Удачи

T





uiviewanimationtransition