2011-10-17 13 views
21

iOS'ta görüntüyü değiştiren, başka bir görünüme sığdırmak için yeniden boyutlandırılan, sonra da diğer görüntüyü geri çeviren çok basit bir animasyonum var. Oldukça kolay ve çok basit.Bu iOS animasyonunu OSX'te nasıl yapabilirim?

OSX'de tam olarak böyle bir şey yapmaya çalışıyorum ama nasıl yapılacağını anlayamadım. OSX'deki animasyon öğeleri iOS'a kıyasla çok karmaşık ve zor hissediliyor.

Herhangi bir yardım çok takdir edilecektir!

Teşekkürler! :)

// Fade out viewOne, resize frame to fit viewTwo, fade in viewTwo 
[UIView animateWithDuration: 0.15 
     animations: ^{ 
      [viewOne setAlpha:0.0]; 
     } 
     completion: ^(BOOL finished) { 
      [UIView animateWithDuration: 0.2 
        animations: ^{ 
         [self setFrame: [viewTwo frame]]; 
        } 
        completion: ^(BOOL finished) { 
         [viewTwo setAlpha: 0.0]; 
         [self addSubview: viewTwo]; 
         [UIView animateWithDuration: 0.15 
           animations: ^{ 
            [viewTwo setAlpha:1.0]; 
           }]; 
        }]; 
     }]; 

cevap

21

Ben OSX üzerinde animatör proxy kullanarak zaman yukarıdaki gibi özellikle aynı şeyi başarmak için blokları kullanan küçük sınıf yazdık.

Lütfen dikkat, bu sınıf iş parçacığı güvenli değildir ve herhangi bir özel veya stresli test geçirmemiş.

//Interface 
@interface MZAnimator : NSObject{} 

+ (void)animateWithDuration:(NSTimeInterval)duration 
        animation:(void (^)(void))animationBlock; 
+ (void)animateWithDuration:(NSTimeInterval)duration 
        animation:(void (^)(void))animationBlock 
       completion:(void (^)(void))completionBlock; 
@end 


//Implementation 
@interface MZAnimator() 
+ (void)runEndBlock:(void (^)(void))completionBlock; 
@end 

@implementation MZAnimator 

+ (void)animateWithDuration:(NSTimeInterval)duration 
        animation:(void (^)(void))animationBlock 
{ 
    [self animateWithDuration:duration animation:animationBlock completion:nil]; 
} 
+ (void)animateWithDuration:(NSTimeInterval)duration 
        animation:(void (^)(void))animationBlock 
       completion:(void (^)(void))completionBlock 
{ 
    [NSAnimationContext beginGrouping]; 
    [[NSAnimationContext currentContext] setDuration:duration]; 
    animationBlock(); 
    [NSAnimationContext endGrouping]; 

    if(completionBlock) 
    { 
    id completionBlockCopy = [[completionBlock copy] autorelease]; 
    [self performSelector:@selector(runEndBlock:) withObject:completionBlockCopy afterDelay:duration]; 
    } 
} 

+ (void)runEndBlock:(void (^)(void))completionBlock 
{ 
    completionBlock(); 
} 
@end 
+3

Güzel çözüm :-) daha da bu NSView' 'bir kategori olarak uygulanabilecek UIView'' gibi yapmak; animasyonlar daha sonra 'NSView' sınıf yöntemleri olarak çağrılırdı. –

+0

Harika bir fikir! Bazı sınıf işlevleri kullanımı kolaylaştırabilir ve hassaslaştırabilir. Teşekkürler! – Tyler

+0

Çok iyi !!!!!!!!! – SpaceDog

17

Sen kullanabilirsiniz:

[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) { 
    [context setDuration:2.0]; 
    //Animation code 
    } completionHandler:^{ 
    //Completion Code 
    NSLog(@"Completed"); 
    }]; 
+1

Bunu ve çöpünü denedim. Çok yavaş ve hızlıdır ve NSButtons gibi nesnelerle kullanırken, animasyon başladığında arka plan rengi kaybolur. –

İlgili konular