Пользовательская анимация для нажатия UIViewController
Я хочу показать пользовательскую анимацию при нажатии контроллера вида: я хотел бы добиться чего-то вроде анимации "expand", что означает, что новое представление расширяется из заданного прямоугольника, скажем, [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
я не могу изменить размер рамки представления... am I?
Ответы
Ответ 1
Что вы можете сделать, это нажать следующий контроллер представления, но не анимировать его, например:
[self.navigationController pushViewController:nextController animated:NO];
... и затем в контроллере представления, который вставляется в него, вы можете сделать пользовательскую анимацию этого вида с помощью CoreAnimation. Это может быть лучше всего сделано в методе viewDidAppear:(BOOL)animated
.
Ознакомьтесь с Core Animation Guide о том, как на самом деле сделать анимацию. Посмотрите, в частности, на неявную анимацию.
EDIT: обновленная ссылка
Ответ 2
Я использую следующую функцию (добавленную к UINavigationController
) для настройки анимации push:
- (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];
}
Я думаю, вы могли бы адаптировать этот код для выполнения любой анимации, которую вы хотите.
Ответ 3
Код, который вы ищете:
[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];
Ответ 4
Генрих,
Я сделал учебник по youtube, в котором показано, как сделать просмотр расширяться и сокращаться, например, в приложении для iPhone facebook.
Надеюсь, что это может помочь: Как сделать расширяющиеся/сокращающиеся виды на iPhone SDK
Адам
Ответ 5
@zoul: Это сработало отлично! Я просто изменил "я" на "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 переместился до конца после анимации. Не знаю, был ли этот кошерный, но опять же он работал.
Ответ 6
Что вы хотите - это загрузки для главы 2 кулинарная книга разработчиков iphone. Посмотрите на образец affineRotate конкретно, хотя любой из основных образцов аниматина поможет вам.
Ответ 7
Посмотрите ADTransitionController, сокращение замены для UINavigationController с помощью настраиваемых анимаций перехода (его API соответствует API UINavigationController), который мы создали в Applidium.
Вы можете использовать разные предопределенные анимации для действий push и pop, таких как Swipe, Fade, Cube, Carrousel и т.д. В вашем случае анимация, которую вы запрашиваете, называется так называемой Zoom.