Пользовательская анимация для нажатия UIViewController - PullRequest
54 голосов
/ 10 сентября 2009

Я хочу показать пользовательскую анимацию при нажатии контроллера вида: я хотел бы добиться чего-то вроде анимации «расширения», то есть новый вид расширяется из заданного прямоугольника, скажем, [100,100 220,380] во время анимации полный экран.

Есть предложения, с чего начать, соответственно любые документы, учебные пособия, ссылки? :)


Хорошо. Я мог бы сделать расширенную анимацию с помощью следующего кода:

if ([coming.view superview] == nil)   
    [self.view addSubview:coming.view];
    coming.view.frame = CGRectMake(160,160,0,0);
    [UIView beginAnimations:@"frame" context:nil];
    [UIView setAnimationDuration:4];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [coming viewWillAppear:YES];
    [going viewWillAppear:YES];
    coming.view.frame = CGRectMake(0, 0, 320, 480);
    [going viewDidDisappear:YES];
    [coming viewDidAppear:YES];
    [UIView commitAnimations];

Мой вид отображается правильно, но, к сожалению, панель навигации не обновляется. Есть ли способ сделать это вручную?


В примере кода вызывается функция все 0,03 секунды, которая обновляет преобразование представления. К сожалению, когда я нажимаю UIViewController, я не могу изменить размер кадра ... я?

Ответы [ 6 ]

53 голосов
/ 15 марта 2010

Я использую следующую функцию (добавлена ​​к UINavigationController) для настройки анимации нажатия:

- (void) pushController: (UIViewController*) controller
         withTransition: (UIViewAnimationTransition) transition
{
    [UIView beginAnimations:nil context:NULL];
    [self pushViewController:controller animated:NO];
    [UIView setAnimationDuration:.5];
    [UIView setAnimationBeginsFromCurrentState:YES];        
    [UIView setAnimationTransition:transition forView:self.view cache:YES];
    [UIView commitAnimations];
}

Полагаю, вы могли бы адаптировать этот код для создания любой анимации.

34 голосов
/ 04 сентября 2010

Код, который вы ищете:

    [UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:0.80];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

[UIView setAnimationTransition:
 UIViewAnimationTransitionFlipFromRight
                       forView:self.navigationController.view cache:NO];


[self.navigationController pushViewController:menu animated:YES];
[UIView commitAnimations];
24 голосов
/ 25 ноября 2009

Что вы можете сделать, это нажать следующий контроллер представления, но не анимировать его, например:

[self.navigationController pushViewController:nextController animated:NO];

... и затем, в выдвигаемом контроллере представления, вы можете сделать собственную анимацию его представления, используя CoreAnimation. Лучше всего это сделать методом viewDidAppear:(BOOL)animated.

Ознакомьтесь с Core Animation Guide о том, как на самом деле сделать анимацию. Особенно обратите внимание на неявную анимацию.

РЕДАКТИРОВАТЬ: обновленная ссылка

7 голосов
/ 12 августа 2010

@ zoul: Отлично сработало! Я просто изменил «self» на «self.navigationController» и «self.view» на «self.navigationController.view». Не знаю, было ли это необходимо, но это сработало. И @crafterm, что касается возврата назад, просто создайте свой собственный leftBarButtonItem, добавив этот код в viewDidLoad или ViewWillAppear:

//add your own left bar button
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonTapped)];
self.navigationItem.leftBarButtonItem = backButton;
[backButton release];

Затем я просто настроил функцию push и создал функцию popWithTransition, которую я вызвал в своем методе -backButtonTapped.

- (void) popWithTransition: (UIViewAnimationTransition) transition
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:.75];
    [UIView setAnimationBeginsFromCurrentState:YES];        
    [UIView setAnimationTransition:transition forView:self.navigationController.view cache:YES];
    [UIView commitAnimations];
[self.navigationController popViewControllerAnimated:NO];
}

Обратите внимание, что вызов popViewController сдвинут до конца после анимации. Не знаю, кошерный ли это, но опять же, это сработало.

3 голосов
/ 17 июля 2013

Взгляните на ADTransitionController , каплю замены UINavigationController с пользовательскими анимациями перехода (его API соответствует API UINavigationController), который мы создали в Applidium.

Вы можете использовать различные предопределенные анимации для действий push и pop , таких как Swipe , Fade , Cube , Карусель и так далее. В вашем случае запрашиваемая анимация называется Zoom .

3 голосов
/ 10 сентября 2009

То, что вы хотите, это загрузки для главы 2 поваренная книга разработчиков iphone . Обратите особое внимание на образец affineRotate, хотя любой из основных образцов аниматина поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...