2010-10-28 3 views
2

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

- (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]; 
} 

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

Но мой главный вопрос в том, что я пытаюсь создать поп, который «отменит» вышеуказанную функцию. Для большей ясности, скажем, у меня есть два вида, A и B. A - это первый вид, который отображается на экране. Функция выше, будет двигаться в B, не выталкивая A out. Очень похоже на модальное представление. Но функция ниже слайдов 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]; 
} 

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

ответ

3

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

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]; 
} 

Вы также можете создать пользовательский переход для pop, используя анимацию 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]; 
Смежные вопросы