iPhone UIView Анимация Лучшая практика

142

Что считается лучшей практикой для анимации переходов между видами на iPhone?

Например, ViewTransitionsпример проекта от Apple использует такой код:

CATransition *applicationLoadViewIn = [CATransition animation];
[applicationLoadViewIn setDuration:1];
[applicationLoadViewIn setType:kCATransitionReveal];
[applicationLoadViewIn setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];
[[myview layer] addAnimation:applicationLoadViewIn forKey:kCATransitionReveal];

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

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.75];
[UIView setAnimationDelegate:self];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:myview cache:YES];
[myview removeFromSuperview];
[UIView commitAnimations];

Каков наилучший подход? Если бы вы могли предоставить фрагмент, это было бы очень ценно.

ПРИМЕЧАНИЕ: я не смог заставить второй подход работать правильно.

Кит Фитцджеральд
источник

Ответы:

118

Из справочного раздела UIView о beginAnimations:context:методе:

Использование этого метода не рекомендуется в iPhone OS 4.0 и более поздних версиях. Вместо этого вы должны использовать блочные методы анимации.

Например, блочная анимация на основе комментария Тома

[UIView transitionWithView:mysuperview 
                  duration:0.75
                   options:UIViewAnimationTransitionFlipFromRight
                animations:^{ 
                    [myview removeFromSuperview]; 
                } 
                completion:nil];
Рафаэль Вега
источник
4
Итак ... чтобы было понятно, что значит использовать первый подход (CATransition), а не второй?
Стив N
2
Да, это первый подход (CATransition).
NebulaFox
16
@ Steven N, нет, это значит использовать UIViewвместо этого анимацию на основе блоков . По сути, они такие же, как beginAnimationsи друзья, но используют функции блокировки / закрытия.
Дэн Розенстарк
36
Да, Яр прав. Вот как выглядит блочная анимация: [UIView transitionWithView:mysuperview duration:0.75 options:UIViewAnimationTransitionFlipFromRight animations:^{ [myview removeFromSuperview]; } completion:nil]Подробности смотрите в документации по UIView.
Том ван Цуммерен
3
За исключением случаев, когда вы хотите поддерживать телефоны 3.1.3. Тогда не используйте блоки.
ZaBlanc
69

Я использовал последний для множества легких и легких анимаций. Вы можете использовать его для затухания двух видов, или для затухания одного перед другим, или для затухания. Вы можете снимать вид поверх другого, как баннер, вы можете увеличивать или уменьшать вид ... Я получаю много пробега из beginAnimation/ commitAnimations.

Не думайте, что все, что вы можете сделать, это:

[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:myview cache:YES];

Вот образец:

[UIView beginAnimations:nil context:NULL]; {
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationDelegate:self];
    if (movingViewIn) {
// after the animation is over, call afterAnimationProceedWithGame
//  to start the game
        [UIView setAnimationDidStopSelector:@selector(afterAnimationProceedWithGame)];

//      [UIView setAnimationRepeatCount:5.0]; // don't forget you can repeat an animation
//      [UIView setAnimationDelay:0.50];
//      [UIView setAnimationRepeatAutoreverses:YES];

        gameView.alpha = 1.0;
        topGameView.alpha = 1.0;
        viewrect1.origin.y = selfrect.size.height - (viewrect1.size.height);
        viewrect2.origin.y = -20;

        topGameView.alpha = 1.0;
    }
    else {
    // call putBackStatusBar after animation to restore the state after this animation
        [UIView setAnimationDidStopSelector:@selector(putBackStatusBar)];
        gameView.alpha = 0.0;
        topGameView.alpha = 0.0;
    }
    [gameView setFrame:viewrect1];
    [topGameView setFrame:viewrect2];

} [UIView commitAnimations];

Как видите, вы можете играть с альфа-каналом, рамками и даже размерами вида. Тренировка Вы можете быть удивлены его возможностями.

mahboudz
источник
52

Разница, кажется, заключается в количестве контроля над анимацией.

CATransitionПодход дает больше контроля и , следовательно , больше вещей , чтобы создать, например. функция времени. Будучи объектом, вы можете сохранить его на потом, рефакторинг, чтобы направить на него все ваши анимации, чтобы уменьшить дублирование кода и т. Д.

В UIViewметодах класса являются удобными методами для общих анимации, но более ограничены , чем CATransition. Например, есть только четыре возможных типа перехода (перевернуть влево, перевернуть вправо, свернуться вверх, свернуться вниз). Если вы хотите сделать постепенное усиление, вам нужно будет либо перейти к CATransition'sпостепенному переходу, либо настроить явную анимацию UIViewальфа- канала .

Обратите внимание, что CATransitionв Mac OS X позволит вам указать произвольный CoreImageфильтр для использования в качестве перехода, но в настоящее время вы не можете сделать это на iPhone, которого нет CoreImage.

Райан Маккуэйг
источник
7
Обратите внимание, что это совет эпохи iOS 2.0. Посмотрите ответ Рафаэля Веги о блочных методах, если вы используете iOS 4.0 или более позднюю версию.
Райан МакКуайг,
Также обратите внимание, что CoreImage теперь доступен с iOS 5, но только некоторые его функции. Я считаю, что вы можете использовать переход CoreImage в анимации, но вы не можете создавать собственные фильтры CoreImage на iOS (5).
Аарон Эш,
26

Мы можем анимировать изображения в ios 5, используя этот простой код.

CGRect imageFrame = imageView.frame;
imageFrame.origin.y = self.view.bounds.size.height;

[UIView animateWithDuration:0.5
    delay:1.0
    options: UIViewAnimationCurveEaseOut
    animations:^{
        imageView.frame = imageFrame;
    } 
    completion:^(BOOL finished){
        NSLog(@"Done!");
    }];
Гуру
источник
5
это доступно и в iOS 4 и называется «блочной» анимацией. Это не ограничено iOS 5 и позже.
Джонбейкерс
8

В UIViewдокументации читайте об этой функции для ios4 +.

+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion
Крис
источник
6

В любом случае, метод «Блок» предпочтителен в настоящее время. Я объясню простой блок ниже.

Рассмотрим разрезанную ниже. bug2 и bug 3 являются imageViews. Анимация ниже описывает анимацию продолжительностью 1 секунда с задержкой в ​​1 секунду. Ошибка 3 перемещается из центра в центр ошибки 2. Как только анимация будет завершена, она будет записана как «Центр анимации готов!».

-(void)centerAnimation:(id)sender
{
NSLog(@"Center animation triggered!");
CGPoint bug2Center = bug2.center;

[UIView animateWithDuration:1
                      delay:1.0
                    options: UIViewAnimationCurveEaseOut
                 animations:^{
                     bug3.center = bug2Center;
                 } 
                 completion:^(BOOL finished){
                     NSLog(@"Center Animation Done!");
                 }];
}

Надеюсь, что это чисто!

Deepukjayan
источник
2
Вы назначили CGPoint bug3.center на bug3Center, и сразу после этого вы назначаете CGPoint bug2.center той же переменной bug3Center? Зачем ты это делаешь ?
pnizzle
oopss !! это опечатки приятелей. Обновлено сейчас.
Дипукджаян
2

Вот код для плавной анимации, может быть полезным для многих разработчиков.
Я нашел этот фрагмент кода из этого урока.

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[animation setAutoreverses:YES];
[animation setFromValue:[NSNumber numberWithFloat:1.3f]];
[animation setToValue:[NSNumber numberWithFloat:1.f]];
[animation setDuration:2.f];
[animation setRemovedOnCompletion:NO];

[animation setFillMode:kCAFillModeForwards];
[[self.myView layer] addAnimation:animation forKey:@"scale"];/// add here any Controller that you want t put Smooth animation.
iPatel
источник
2

давайте попробуем проверить О Swift 3 ...

UIView.transition(with: mysuperview, duration: 0.75, options:UIViewAnimationOptions.transitionFlipFromRight , animations: {
    myview.removeFromSuperview()
}, completion: nil)
Саурабх Шарма
источник