Лучшая практика iPhone UIView Animation

Что считается лучшей практикой для анимации переходов на 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];

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

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

Ответ 1

В разделе UIView reference о методе beginAnimations:context::

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

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

[UIView transitionWithView:mysuperview 
                  duration:0.75
                   options:UIViewAnimationTransitionFlipFromRight
                animations:^{ 
                    [myview removeFromSuperview]; 
                } 
                completion:nil];

Ответ 2

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

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

Ответ 3

Разница, похоже, зависит от количества элементов управления, которые вам нужны над анимацией.

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

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

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

Ответ 4

Мы можем анимировать изображения в 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

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

+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion

Ответ 6

В любом случае метод "Блок" используется сегодня. Я объясню простой блок ниже.

Рассмотрим сокращенный снимок. bug2 и ошибка 3 - imageViews. В приведенной ниже анимации описывается анимация с продолжительностью 1 секунда после задержки 1 секунды. Баг3 перемещается из центра в центр bug2. Как только анимация будет завершена, она будет занесена в журнал "Центр анимации Сделано!".

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

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

Ответ 7

Я нашел хороший учебник по этой ссылке. Надеюсь, это будет полезно для кого-то.

uiview-animation-tutorial

Ответ 8

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

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.

Ответ 9

Для Swift 3...

       UIView.transition(with: mysuperview, duration: 0.75, options:UIViewAnimationOptions.transitionFlipFromRight , animations: {

        myview.removeFromSuperview()
    }, completion: nil)