2011-10-17 30 views
21

Tôi có một hoạt ảnh rất đơn giản trong iOS làm mờ chế độ xem, định lại kích thước vùng chứa để phù hợp với chế độ xem khác, sau đó làm mờ chế độ xem khác trở lại. Nó khá dễ làm và rất đơn giản.Tôi làm cách nào để thực hiện hoạt ảnh iOS này trên OSX?

Tôi đã cố gắng làm một cái gì đó khá chính xác như thế này trên OSX, nhưng tôi đã không thể tìm ra cách để làm điều đó. Các công cụ hoạt hình trên OSX cảm thấy rất khó khăn và khó khăn so với iOS.

Mọi trợ giúp sẽ được đánh giá cao !!

Cảm ơn! :)

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

Trả lời

21

Tôi đã viết một lớp nhỏ sử dụng các khối để hoàn thành về cơ bản giống như trên khi sử dụng proxy hoạt hình trên OSX.

Xin lưu ý, lớp này không phải là chủ đề an toàn và chưa trải qua bất kỳ bài kiểm tra cụ thể hoặc căng thẳng nào.

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

đẹp giải pháp :-) Để làm cho nó thậm chí nhiều hơn như 'UIView' này có thể được thực hiện như một phạm trù của' NSView'; các hình động sau đó sẽ được gọi là các phương thức lớp của 'NSView'. –

+0

Một ý tưởng tuyệt vời! Một vài hàm lớp có thể hợp lý hóa và tinh chỉnh việc sử dụng. Cảm ơn! – Tyler

+0

rất tốt !!!!!!!!! – SpaceDog

17

Bạn có thể sử dụng:

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

Tôi đã thử điều này và rác của nó. Nó rất chậm và laggy và khi sử dụng với các đối tượng như NSButtons, màu nền biến mất khi hoạt ảnh bắt đầu. –

Các vấn đề liên quan