53

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

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


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

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

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


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

ответ

25

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

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

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

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

EDIT:updated link

+3

Я пробовал этот подход, но проблема в том, что при использовании этого нажатия первый контроллер просмотра исчезает до того, как следующий контроллер начнет анимацию. Что должно произойти: 1) следующий контроллер просмотра оживляет, и его вид полностью охватывает вид старого vc, а затем выдает старый vc. Я компилирую для iOS 4.3, и это не работает. – SpaceDog

+1

Это тоже не масштабируется. Контроллер навигации должен обрабатывать анимацию. Это хак, который вам нужно будет реализовать для каждого нажатого контроллера. –

3

Что вы хотите загрузить для главы 2 из iphone developers cookbook. Посмотрите на образец affineRotate конкретно, хотя любой из основных образцов аниматина поможет вам.

+0

Спасибо. Я буду в нем. – Erik

52

Я использую следующую функцию (добавляется 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]; 
} 

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

+2

Ницца, как вы обрабатываете корпус popViewController? из того, что я вижу, нажатие кнопки «Назад» не вызывает какую-либо заданную пару целевых/селекторов, даже если вы перегружаете кнопку «Назад» и предоставляете ее, поэтому вы не можете установить ее для указания пользовательского метода pop, который включает анимацию? – crafterm

+0

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

+1

, где я должен написать этот код? – ichanduu

7

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

Тогда я просто переделаны функцию нажимной и сделал эту функцию 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 сместился до конца после анимации. Не знаю, было ли это кошерным, но опять-таки это сработало.

10

Heinrich,

Я сделал учебник, показывающий, как юность сделать вид расширяться и сжиматься, как в приложении facebook iPhone.

Надеется, что это может помочь: How to make expanding/shrinking views on iPhone SDK

Адама

+0

хорошим, очень полезным для me – harshalb

+0

@Adam, так что я учился у вас в учебнике для iPad-приложения. Я заметил, что центр анимации в ландшафтном режиме неверен. что нужно сделать, чтобы анимация выглядела правильной в ландшафтном режиме? Мне нужно сообщить анимацию, где должны быть начальные границы. – topwik

34

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

[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]; 
+0

Как обрабатывать сценарий popViewController? – Ans

3

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

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

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