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


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

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

Примечание: Я не смог сделать второй подход к работе правильно.

9 141

9 ответов:

С ссылка UIView ' s раздел о beginAnimations:context: способ:

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

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

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

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

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

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

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

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

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

мы можем анимировать изображения в 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!");
    }];

на UIView docs, есть прочитать об этой функции для ios4+

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

в любом случае метод" блок " предпочтен сейчас-в-дни. Я объясню простой блок ниже.

рассмотрим обрезанные ниже. bug2 и bug 3-это просмотры изображений. Приведенная ниже анимация описывает анимацию с длительностью 1 секунда после задержки в 1 секунду. Bug3 перемещается из своего центра в центр bug2. Как только анимация будет завершена, она будет зарегистрирована "Center Animation Done!".

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

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

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

uiview-анимация-учебник

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

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.

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

UIView.transition(with: mysuperview, duration: 0.75, options:UIViewAnimationOptions.transitionFlipFromRight , animations: {
    myview.removeFromSuperview()
}, completion: nil)