Представить UIViewController со стороны - PullRequest
0 голосов
/ 19 декабря 2010

Я пытаюсь представить UIViewController со стороны.Единственное, что может сделать Present Modal, - это вставить Verticle.

У кого-нибудь есть идеи по этому поводу?

Дайте мне знать, спасибо

Ответы [ 3 ]

2 голосов
/ 19 декабря 2010

Если говорить анально о MVC , это действительно Просмотр вашего движения, а не контроллера.

Я бы порекомендовал способ сделать это - использовать навигационный контроллер, этоПо умолчанию анимация представляет собой горизонтальный слайд, и вы получаете навигационный стек бесплатно. Это означает, что у вас есть автоматически созданные кнопки «Назад» и свойства заголовка и кнопок, которые можно установить, хотя их можно легко скрыть.

Используя контроллер навигации:

создайте свойство UINavigationsController в вашем родительском контроллере, syth, alloc и соответствующим образом запустите его.Затем вы можете загружать контроллеры в любом порядке, который вам нужен, и он выглядит после навигации.

Здесь - хорошее руководство по NavControllers (обычно они используются с UITableViewControllers, но не имеютбыть)

Примером Пенга является анимация, и я должен отметить, что он удаляет родительское представление (и в зависимости от вашего дизайна не может просто удалить 'currentView' - как ваш / верхпредставление может быть подпредставлением), поэтому если вы вернетесь назад, вам придется справиться с этим самостоятельно.

2 голосов
/ 19 декабря 2010

Я сделал это, и это сработало, хотя я не знаю, есть ли более официальный способ сделать это (UIVIewAimationTransition не имеет опции слайда):

    UIView *currentView = self.view;
UIView *theWindow = [currentView superview];

[currentView removeFromSuperview];

CATransition *animation = [CATransition animation];
[animation setDuration:0.5];
[animation setType:kCATransitionPush];
[animation setSubtype:kCATransitionFromLeft];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];

[[theWindow layer] addAnimation:animation forKey:@"SwitchToView1"];
0 голосов
/ 17 июня 2015

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

Все ViewControllers в моем приложении наследуются от MyViewController, который, в дополнение к некоторым другим поведениям по умолчанию, имеет это свойство:

@property(readwrite, nonatomic) BOOL slideFromSide;

И этот код:

- (void) presentViewController: (UIViewController*) vc animated: (BOOL) flag completion: (void (^)(void)) completion
{
    BOOL slideIn = NO;
    if ([vc isKindOfClass: [MyViewController class]])
    {
        MyViewController *svc = (MyViewController*) vc;
        slideIn = svc.slideFromSide;
    }

    if (slideIn)
    {
        [self addChildViewController: vc];
        [self.view addSubview: vc.view];

        CGRect frame = vc.view.frame;
        frame.origin.x = frame.size.width;
        vc.view.frame = frame;

        frame.origin.x = 0;
        [UIView animateWithDuration: 0.33
                         animations: ^{
                             vc.view.frame = frame;
                         }
         ];
    }
    else
    {
        [super presentViewController: vc animated: flag completion: completion];
    }
}


- (IBAction) backAction: (id) sender
{
    if (_slideFromSide)
    {
        CGRect frame = self.view.frame;
        frame.origin.x = frame.size.width;
        [UIView animateWithDuration: 0.33
                         animations: ^{
                             self.view.frame = frame;
                         }
                         completion:^(BOOL finished) {
                             [self removeFromParentViewController];
                         }
         ];
    }
    else
    {
        [self dismissViewControllerAnimated: YES completion: nil];
    }
}

Затем в ViewControllers, куда я хочу вставить, у меня есть:

- (id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName: nibNameOrNil bundle: nibBundleOrNil];
    if (self)
    {
        self.slideFromSide = YES;
        // Whatever else you want to do
    }

    return self;
}

Вызов нового ViewController аналогичен обычному:

WhateverViewController *vc = [WhateverViewController alloc] initWithNibName: nil bundle: nil];
[self presentViewController: vc animated: YES completion: nil];
...