iPhone UIView Animation En İyi Uygulama


142

İPhone'da görünüm geçişlerini canlandırmak için en iyi uygulama nedir?

Örneğin, ViewTransitionsApple'ın örnek projesi aşağıdaki gibi bir kod kullanır:

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

ancak netin etrafında yüzen ve şöyle görünen kod parçacıkları da vardır:

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

En iyi yaklaşım nedir? Bir pasaj da sağlayabilirseniz çok takdir edilecektir.

NOT: İkinci yaklaşımın düzgün çalışmasını sağlayamadım.

Yanıtlar:


118

Kaynaktan UIView referans yaklaşık sitesindeki bölümü beginAnimations:context:yöntemi:

Bu yöntemin kullanımı iPhone OS 4.0 ve sonraki sürümlerde önerilmez. Bunun yerine blok tabanlı animasyon yöntemlerini kullanmalısınız.

Tom'un Yorumuna Dayalı Blok Tabanlı Animasyon Örneği

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

4
Yani açık olmak gerekirse, bu ikinci yaklaşımı (CATransition) kullanmak demektir, ikincisini değil?
Steve N

2
Evet, bu ilk yaklaşımdır (CATransition).
NebulaFox

16
@Steven N, hayır, bunun UIViewyerine blok tabanlı animasyonları kullanmak anlamına gelir . Temelde beginAnimationsve arkadaşlarla aynıdırlar, ancak engelleme / kapatma özelliklerini kullanırlar.
Dan Rosenstark

36
Evet, Yar haklı. Bir blok animasyonu şöyle görünür: [UIView transitionWithView:mysuperview duration:0.75 options:UIViewAnimationTransitionFlipFromRight animations:^{ [myview removeFromSuperview]; } completion:nil]Ayrıntılar için UIView belgelerine bakın.
Tom van Zummeren

3
3.1.3 telefonları desteklemek istiyorsanız. O zaman blok kullanmayın.
ZaBlanc

69

İkincisini çok güzel hafif animasyonlar için kullanıyorum. İki görünümü crossfade ile kullanabilir veya birini diğerinin önüne ya da solmaya kullanabilirsiniz. Afiş gibi bir diğerinin üzerine bir görüntü çekebilir, bir görünümü uzatabilir veya küçültebilirsiniz ... beginAnimation/'den çok fazla kilometre alıyorum commitAnimations.

Tek yapabileceğinizi düşünmeyin:

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

İşte bir örnek:

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

Gördüğünüz gibi alfa, çerçeveler ve hatta görünüm boyutlarıyla oynayabilirsiniz. Oynamak. Yetenekleri sizi şaşırtabilir.


52

Fark, animasyon üzerinde ihtiyacınız olan kontrol miktarı gibi görünüyor.

CATransitionYaklaşım size örneğin kurmak için daha fazla kontrole ve dolayısıyla daha fazla şey verir. zamanlama işlevi. Bir nesne olarak, daha sonra kullanmak üzere saklayabilirsiniz, çoğaltılmış kodu azaltmak için tüm animasyonlarınızı ona yönlendirmek için yeniden düzenleme yapabilirsiniz.

UIViewSınıf yöntemleri yaygın animasyonlar için kolaylık yöntemlerdir, ancak birden fazla sınırlıdır CATransition. Örneğin, yalnızca dört olası geçiş türü vardır (sola, sağa, kıvır, yukarı kıvır). Bir solma yapmak istiyorsanız, CATransition'ssolmaya geçiş yapmak için kazmanız veya alfa'nızın açık bir animasyonunu ayarlamanız gerekir UIView.

O Not CATransitionMac OS X bir rasgele belirtmek sağlayacak CoreImagebir geçiş olarak kullanmak için filtreyi, ama şimdi duruyor gibi yoksun iPhone, üzerinde bunu yapamaz CoreImage.


7
Bunun iOS 2.0 dönemi tavsiyesi olduğunu unutmayın. İOS 4.0 veya sonraki bir sürümdeyseniz Rafael Vega'nın blok tabanlı yöntemlerle ilgili cevabına bakın.
Ryan McCuaig

Ayrıca CoreImage'ın artık iOS 5'ten itibaren kullanılabildiğini, ancak özelliklerinden sadece birkaçı olduğunu unutmayın. Animasyonda bir CoreImage geçişi kullanabileceğinizi düşünüyorum, ancak iOS'ta özel CoreImage filtreleri yapamıyorsunuz (5).
Aaron Ash

26

Bu basit kodu kullanarak ios 5'te görüntüleri canlandırabiliriz.

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
bu, iOS 4'te de mevcuttur ve "blok tabanlı" animasyon olarak adlandırılır. İOS 5 ve sonraki sürümlerle sınırlı değildir.
johnbakers

8

In UIViewdocs, bu işlevi hakkında bir okuma var iOS4 +

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

6

Her neyse, "Blok" yöntemi her gün tercih edilmektedir. Aşağıdaki basit bloğu açıklayacağım.

Aşağıdaki snipsi düşünün. bug2 ve bug 3 imageViews'tir. Aşağıdaki animasyon, 1 saniyelik bir gecikmeden sonra 1 saniyelik bir animasyonu açıklar. Bug3 merkezinden merkezinden bug2 merkezine taşındı. Animasyon tamamlandığında "Merkez Animasyonu Yapıldı!"

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

Temiz umuyoruz !!!


2
CG3 bug3.center'ı bug3Center'a ve bundan hemen sonra CGPoint bug2.center'ı aynı değişken bug3Center'a mı atadınız? Bunu neden yapıyorsun ?
pnizzle

oopss !! bu bir yazım hatası arkadaşlar. Şimdi güncellendi.
Deepukjayan

2

İşte Pürüzsüz animasyon için Kod, birçok geliştirici için yararlı olabilir.
Bu kod parçacığını bu derste buldum.

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.

2

Swift 3 için deneyelim ve yapalım ...

UIView.transition(with: mysuperview, duration: 0.75, options:UIViewAnimationOptions.transitionFlipFromRight , animations: {
    myview.removeFromSuperview()
}, completion: nil)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.