2015-05-19 8 views
1

У меня есть контроллер вида, который на определенном действии представляет другой контроллер вида, который закрывает нижнюю половину экрана.Анимация представления представления контроллера во время анимации представленного представления контроллера

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

- (void)animatePresentationWithTransitioningContext:(id<UIViewControllerContextTransitioning>) transitioningContext 
{ 
    UIViewController *presentedController = [transitioningContext viewControllerForKey:UITransitionContextToViewControllerKey]; 
    UIView *presentedControllerView = [transitioningContext viewForKey:UITransitionContextToViewKey]; 
    UIView *containerView = [transitioningContext containerView]; 

    presentedControllerView.frame = [transitioningContext finalFrameForViewController:presentedController]; 

    CGPoint center = presentedControllerView.center; 
    center.y = containerView.bounds.size.height; 
    presentedControllerView.center = center; 

    [containerView addSubview:presentedControllerView]; 

    // This returns nil 
    UIView *presentingControllerView = [transitioningContext viewForKey:UITransitionContextFromViewKey]; 

    [UIView animateWithDuration:[self transitionDuration:transitioningContext] delay:0.0 usingSpringWithDamping:1.0 initialSpringVelocity:0.0 options:UIViewAnimationOptionAllowUserInteraction animations:^{ 
     CGPoint presentedViewCenter = presentedControllerView.center; 
     presentedViewCenter.y -= containerView.bounds.size.height/2.0; 
     presentedControllerView.center = presentedViewCenter; 

     // This is where I want to move the presenting view controller. 
     // of course it does not work. 
     CGPoint presentingViewCenter = presentingControllerView.center; 
     presentingViewCenter.y -= containerView.bounds.size.height/2.0; 
     presentingControllerView.center = presentingViewCenter; 

    } completion:^(BOOL finished) { 
     [transitioningContext completeTransition:finished]; 
    }]; 
} 

The viewForKey:UITransitionContextFromViewKey возвращается nil. Я перепробовал shouldRemovePresentersView, чтобы вернуть NO в моем обычном UIPresentationController, но я все еще получаю nil. Я использую UIModalPresentationCustom в качестве модального стиля презентации для представления, которое я представляю.

EDIT:

я понял, что я могу достичь того же аффектом анимировать вид ПРЕДСТАВЛЕНИЕ путем переопределения метода presentationTransitionWillBegin в моем обычае UIPresentationController. Но я хотел бы получить ответ на доступ к контроллеру представления представления.

EDIT: Поскольку я нашел решение, уточняя мой вопрос: (1) Является ли это ожидаемое поведение т.е. presentingViewController будет ноль в объекте аниматора?

+0

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

+0

@matt см. Мое редактирование выше - «Так как я нашел решение, разъясняющее мой вопрос: (1) Является ли это ожидаемым поведением, то есть, presentingViewController будет нулевым в объекте аниматора?» –

+0

И я ответил на это. – matt

ответ

1

Я использую UIModalPresentationCustom в качестве модального стиля презентации для представления, которое я представляю.

Ну, это ваша проблема. В этом случае вид From будет равен нулю. Это ноль, если вы не используете стиль презентации FullScreen.

Я не говорю, что вы ошибаетесь, чтобы сделать стиль презентации Custom. Вам нужно сделать это, , если вы хотите оставить вид контроллера представления на месте, и , если вы хотите предоставить свой собственный контроллер презентации. И вы это делаете! Но в этом случае работа делится: контроллер представления должен отвечать за конечную позицию представления.

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

+0

Если вы правильно поняли, вы предлагаете не использовать пользовательский аниматор. верный? –

+0

Совсем нет! Пользовательские анимации перехода - моя любимая функция iOS 7/8. Я просто описываю, как аниматор и контроллер представления работают вместе. Работу нужно разделить правильно, как я здесь, например: https: // github.com/mattneub/custom-alert-view-iOS7/blob/master/CustomAlertViewDemo/CustomAlertViewTransitioner.swift – matt

+0

И я отредактировал свой ответ, чтобы быть немного понятнее. – matt

Смежные вопросы