iPhone - UINavigationController - пользовательская анимация с CATransaction - PullRequest
2 голосов
/ 28 октября 2010

Я пытаюсь создать категорию для UINavigationController, чтобы я мог собрать несколько пользовательских анимаций. Я наткнулся на этот вопрос , и это заставило меня начать. Я придумал следующее для функции push:

- (void)pushViewControllerMoveInFromBottom:(UIViewController *)viewController {
    [CATransaction begin];
    CATransition *transition;
    transition = [CATransition animation];
    transition.type = kCATransitionMoveIn;
    transition.subtype = kCATransitionFromBottom;
    transition.duration = 0.7;

    [CATransaction setValue:(id)kCFBooleanTrue
                     forKey:kCATransactionDisableActions];

    [[[[self.view subviews] objectAtIndex:0] layer] addAnimation:transition forKey:nil];
    [self  pushViewController:viewController animated:YES];
    [CATransaction commit];
}

Я не понимаю, к какому виду / слою обращаются через вызов subview. Так что, если кто-то может помочь мне понять это, это будет полезно. Похоже, это влияет на то, какое изображение собирается появиться на экране.

Но мой главный вопрос заключается в том, что я пытаюсь создать всплывающее окно, которое будет "отменять" вышеуказанную функцию. Для ясности, скажем, у меня есть два представления: A и B. Первый вид, который отображается на экране. Функция, указанная выше, будет перемещаться в B без выталкивания A наружу. Очень похоже на модальное представление. Но функция, приведенная ниже, сдвигает A обратно над B, а не сдвигает B вверх и оставляет A на месте.

- (void)popViewControllerMoveInFromTop {
    [CATransaction begin];
    CATransition *transition;
    transition = [CATransition animation];
    transition.type = kCATransitionMoveIn;
    transition.subtype = kCATransitionFromTop;
    transition.duration = 0.7;

    [CATransaction setValue:(id)kCFBooleanTrue
                     forKey:kCATransactionDisableActions];

    [[[[self.view subviews] objectAtIndex:0] layer] addAnimation:transition forKey:nil];
    [self  popViewControllerAnimated:YES];    
    [CATransaction commit];
}

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

1 Ответ

3 голосов
/ 22 июня 2011

Я выполнил нечто подобное, хотя я не удосужился перенести это в свою собственную функцию:

CATransition *transition = [CATransition animation];
transition.duration = 0.5;
transition.type = kCATransitionMoveIn;
transition.subtype = kCATransitionFromBottom;
[self.navigationController.view.layer addAnimation:transition forKey:nil];

[self.navigationController popViewControllerAnimated:NO]

Вы можете абстрагироваться. Используя ваш код, это будет выглядеть так:

- (void)popViewControllerMoveInFromTop {
[CATransaction begin];
CATransition *transition;
transition = [CATransition animation];
transition.type = kCATransitionMoveIn;
transition.subtype = kCATransitionFromTop;
transition.duration = 0.7;

[CATransaction setValue:(id)kCFBooleanTrue
                 forKey:kCATransactionDisableActions];

[self.view.layer addAnimation:transition forKey:nil];
[self  popViewControllerAnimated:NO];    
[CATransaction commit];
}

Вы также можете создать собственный переход для поп-музыки, используя анимацию UIView. Здесь вы применяете анимацию к представлению, которое должно исчезнуть, а затем извлекаете его из стека представлений:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.75];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.navigationController.view cache:NO]; 

[self.navigationController popViewControllerAnimated:NO];

[UIView commitAnimations];
...