코코아 애니메이션 예제

코코아 애니메이션 예제

코코아 애니메이션을 사용하여 창의 투명도를 변화시키는 예제. 애플 개발자 문서에서 구할 수 있다. 주요내용은 마우스가 들어오면 불투명해지고 마우스가 나가면 몇 초 후부터 서서히 투명해져 10%까지 투명해지는 창을 만든다.

창의 제어를 위해서 NSWindowController를 사용하고 있으며, NSTrackingArea를 사용하고 있다.

//마우스가 들어오면 불투명하고, 마우스가 나가면 약간의 딜레이 후 투명해지는 애니메이션을 구현한다.

// InspectorController.h

#import <Cocoa/Cocoa.h>
@interface InspectorController : NSWindowController {
    NSTimer *fadeTimer;
}
@end

// InspectorController.m

#import "InspectorController.h"

@implementation InspectorController

-(id)init {
    self = [super initWithWindowNibName:@"Inspector"]; // Inspector.xib 파일이 있어야 한다.
    return self;
}

-(void)dealloc {
    fadeTimer = nil;
    // ARC 환경에서 [super dealloc]은 부를 수 없다.
}

-(void)setFadeTimer:(NSTimer*)timer
{
    if (fadeTimer != timer) {
        [fadeTimer invalidate];
        fadeTimer = timer;
    }
}

// 윈도우가 로드되면 트랙킹 영역을 추가해서 마우스가 들어오고 나가는 것을 잡는다.
-(void)windowDidLoad {
    NSView *containingView = [[[self window] contentView] superView];
    NSTrackingArea *area = [[NSTrackingArea alloc] 
                  initWithRect:[containingView frame] 
                       options:NSTrackingMouseEnteredAndExited 
                         | NSTrackingActiveInActiveApp 
                         | NSTrackingInVisibleRect 
                         owner:self userInfo:nil];
    [containingView addTrackingArea:area];

    // 타이머를 추가해서 4초 후에 페이딩이 시작되도록 한다.
    NSTimer *timer = [NSTimer 
               scheduledTimerWithTimeInterval:4.0 
                                       target:self 
                                     selector:@selector(startFade:)                                      userInfo:nil repeats:NO];
    self setFadeTimer = timer;
}

-(void)mouseEntered:(NSEvent*)event {
    [self setFadeTimer:nil];
    [[[self window] animator] setAlphaValue:1.0];
}

-(void)mouseExited:(NSEvent*)event {
    // 마우스가 빠져나가면 잠시 후 페이딩이 시작된다.
    NSTimer *timer = [NSTimer 
           scheduledTimerWithTimeInterval:2.0 
                                   target:self 
                                 selector:@selector(startFade:) 
                                 userInfo:nil repeat:NO];
    [self setFadeTimer:timer];
}

//실제 투명화 동작
-(void)startFade:(NSTimer*)timer {
    [NSAnimationContent beginGroup]; // ???
    [[NSAnimationContext currentContext] setDuration:10.0];
    [[[self window] animator] setAlphaValue:3.0];
    [NSAnimationContext endGrouping];

    [self setFadeTimer:nil]; // 애니메이션이 시작됨과 동시에 타이머는 nil로 초기화한다.
}
@end