2011-10-17 52 views
21

我在iOS的一個非常簡單的動畫淡入視圖,並調整其大小的容器,以適應另一種觀點,然後消失,其他視圖回。這是很容易做到,非常簡單。如何在OSX上執行此iOS動畫?

我一直在努力做的事情OSX幾乎完全一樣,但我一直無法弄清楚如何做到這一點。與iOS相比,OSX上的動畫內容非常笨重和困難。

任何幫助將不勝感激!

謝謝! :)

// 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]; 
           }]; 
        }]; 
     }]; 

回答

21

我已經寫了一個小的類,使用塊來實現上述在OSX上使用動畫代理時基本上相同的事情。

請注意,這個類不是線程安全的,並沒有經過任何具體或壓力測試。

//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

很好的解決方案:-)爲了使它更喜歡'UIView'這可以被實現爲NSView'的'一類;動畫將被調用爲「NSView」的類方法。 – 2012-04-22 19:41:21

+0

一個好主意!一些類功能可以簡化和改進使用情況。謝謝! – Tyler

+0

很好!!!!!!!!! – SpaceDog

17

您可以使用:

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

我試過這個和它的垃圾。它非常緩慢且遲緩,當使用像NSButtons這樣的對象時,動畫開始時背景顏色會消失。 – 2015-04-01 12:27:49