2011-08-10 18 views
5

seni o kadar gibi bloklar kullanılarak iki aşamalı animataion gerçekleştirebilirsiniz biliyorum: ..fakatÇok aşamalı animasyon kullanarak blokları

[UIView animateWithDuration:25.0 delay:0.0 options:UIViewAnimationCurveLinear animations: 
    ^{ 
     aView.alpha = 2.5;   
    } 
     completion:^(BOOL finished) 
    { 
     aView.hidden = YES; 
    } 
]; 

nasıl bir çok kademeli yaratacak (2'den fazla) animasyon bloklarını kullanarak?

+1

Çok aşamalı animasyon gerçekten UIKit bir eksik tasarım özelliğidir. Bazılarını QuartzCore kullanarak alabilirsin, ama fazla değil. Birisi gelecek dönemde daha iyi bir çözüm bulmalı. –

cevap

11

Kullanım iç içe animasyonlar:

[UIView animateWithDuration:0.5 
         delay:0.0 
        options:UIViewAnimationOptionBeginFromCurrentState 
       animations:^{ 
        //first animation 
       } 
       completion:^(BOOL finished){[UIView animateWithDuration:0.5 
                    delay:0.0 
                   options:UIViewAnimationOptionBeginFromCurrentState 
                   animations:^{ 
                    //second animation 
                   } 
                   completion:^(BOOL finished){//and so on.. 
                   }];}]; 
+0

Apple'ın doc göre, iç içe geçmiş bir animasyon blok değil tamamlama işleyicisinde, ilk animasyon bloğunda kendisi olmalıdır. Yine de sadece bir adlandırma sorunu. https://developer.apple.com/library/ios/documentation/windowsviews/conceptual/viewpg_iphoneos/AnimatingViews/AnimatingViews.html#//apple_ref/doc/uid/TP40009503-CH6-SW11 – ratsimihah

+0

Aslında Apple da bu olduğunu söylüyor ölüm yolu: 'bir tamamlama işleyicisi kullanarak Onlar kendi belgelerinde Listesinde 4-2 ** ** örneklenerek ettik birden animations.' bağlantı birincil yoludur. İlk blokta iç içe blok koyarsanız, aslında oldukça birinci bloğun animasyonlar sona erdi zaman daha ilk blok ile eş zamanlı başlayacağız. – tipycalFlow

+0

Kesinlikle. Bu noktayı çelişen, fakat sadece bir adlandırma sorunu işaret değildi. Bir "tamamlama işleyicisi" ve "iç içe geçmiş bir blok" kullanmak iki farklı tekniktir ve bir tamamlama işleyicisi bloğunu gösterirken "iç içe geçmiş blokları kullan" dediniz. Önemli bir şey değil. – ratsimihah

8

veya bir özyinelemeli, çok aşamalı animasyon yöntemi yapabiliriz: Bu eski bir sorudur farkındayım ama ben eklemek düşündüm

-(void) multiStageAnimate{ 
[UIView animateWithDuration:0.5 
         delay:0.0 
        options:UIViewAnimationOptionBeginFromCurrentState 
       animations:^{ 
        //animation code 
       } 
       completion:^(BOOL finished){ 
        if(/* If terminating condition not met*/) 
         [self multiStageAnimate]; 
       }]; 
} 
0

benim girdim

Ben

Sadece şu anda ayarlanmış tek süresini ve seçeneğini destekler here! mevcut aşamalı animasyon işlemek için bir sınıf yarattı, ama muhtemelen daha özellikler ekleyeceğiz. İşte

Kullanmaya nasıl:

// Create New Animation 
MSAnimation * newAnimation = [MSAnimation newAnimationWithDuration:0.35 andOptions:UIViewAnimationOptionCurveEaseInOut]; 

// Add Sequence 
[newAnimation addNewAnimationStage:^{ 
    greenView.center = CGPointMake(greenView.center.x, greenView.center.y + 100); 
}]; 
[newAnimation addNewAnimationStage:^{ 
    greenView.center = CGPointMake(greenView.center.x + 100, greenView.center.y); 
}]; 
[newAnimation addNewAnimationStage:^{ 
    greenView.center = CGPointMake(greenView.center.x, greenView.center.y + 100); 
}]; 
[newAnimation addNewAnimationStage:^{ 
    greenView.center = CGPointMake(greenView.center.x - 50, greenView.center.y); 
}]; 
[newAnimation addNewAnimationStage:^{ 
    greenView.frame = CGRectMake(0, 0, 100, 100); 
}]; 

// Animate Your Sequence With Completion 
[newAnimation animateSequenceWithCompletion:^{ 
    NSLog(@"All finished!"); 
}]; 

size verir:

Animation Demo