[Cocoa] 마우스 커서 감지 - NSTrackingArea

특정한 뷰에 마우스가 들어오거나 나갈 때에는 이벤트가 발생하는데, 경우에 따라서는 뷰 외부의 다른 객체가 뷰에 이러한 마우스 이벤트가 일어나는 것을 감지해야 할 필요가 있다. 예를 들면 NSView에 대해 별도의 서브 클래싱 없이 마우스 이벤트 처리를 하고 싶을 때처럼 말이다. 이럴 때는 NSTrackingArea를 만들어서 원하는 뷰에 추가해주는 것으로 서브클래싱 작업을 피할 수 있다.

NSTrackingArea

NSTrackingArea는 마우스 추적과 커서 업데이트 이벤트를 특정한 영역에서 구현해준다. 이 추적영역 객체를 생성할 때는 다음과 같은 정보가 필요하다.
1) 영역이 어디인지 (CGRect)
2) 추적 옵션은 무엇인지
3) 타겟은 누구인지 (id)
4) 또 선택적으로 추가로 던질 userInfo는 무엇인지
추적 영역이 붙는 뷰와 메시지를 받는 타겟이 동일할 필요는 없다. 이렇게 생성된 마우스 추적 영역은 뷰에 addTrackingArea: 메소드를 통해 추적영역을 추가하게 된다.
추적 옵션에 따라서, owner는  mouseEnterd:, mouseExited:, mouseMoved:, cursorUpdate: 등의 메시지를 받게 된다.

옵션 – NSTrackingAreaOption

추적옵션(NSTrackingAreaOption)은 다음과 같은 것들이 있다. 각각은 바이트 연산으로 묶어줄 수 있다.

  • NSTrackingMouseEnteredAndExited – 마우스가 들어오고 나가는 것을 감지
  • NSTrackingMouseMoved – 영역 내에서 마우스가 움직이는 것을 감지
  • NSTrackingCursorUpdated – 영역내에 마우스의 움직임을 모두 감지

또한 영역의 상태에 따라서도 추적 여부를 지정할 수 있는 옵션이 있다.

  • NSTrackingActiveWhenFirstResponder – 뷰가 First Responder일 때에만 동작
  • NSTrackingActiveInKeyWindow – 뷰가 키윈도에 있을 때만 동작
  • NSTrackingAciveInActiveApp – 활성화된 앱일 때만 동작
  • NSTrakingActiveAlways – 항상동작

그외 옵션

  • NSTrackingAssumeInside – 별로 쓰이지는 않는다. 추적영역을 벗어난 마우스 포인터가 여전히 그 뷰 안에 있다고 가정한다.
  • NSTrackingInVisibleRect – 뷰의 visibleRect에 동기화됨. 지정해준 rect 크기는 무시된다.
  • NSTrackingEnabledDuringMouseDrage – 드래깅 중간에 영역에 들어갔을 때도 추적을 활성화한다. 이 옵션이 켜지지 않으면 드래그하는 중에 이 영역을 지나갈 때에는 옵션이 활성화되지 않는다.

예제

NSTimer *fadeTimer;
-(void)awakeFramNib {
    NSTrackingArea *area = [[NSTrakingArea alloc] initWithRect:self.window.frame
        option:(NSTrakingMouseEnteredAndExited | NSTrakingActiveInAcitveApp | NSTrackingInVisibleRect)
        owner:self
        userInfo:nil];
    [self.window.contentView addTrackingArea:area];
}
-(void)mouseEnterd:(NSEvent*)event
{
    self.fadeTimer = nil;
    [[self.window animator] setAlphaValue:1.0];
}
-(void)mouseExited:(NSEvent*)event
{
    self.fadeTimer =<# 타이머를 생성 #>
}

소스코드 : http://www.box.com/s/69ded0033db0a452ddf1

Read more

워드프레스에서 고스트로 이전

워드프레스에서 고스트로 이전

이 글을 쓰면서도 믿기 힘든 사실인데, 블로그라는 걸 처음 시작한지가 20년이 되었습니다. 이글루스에서 처음 시작했다가, SK컴즈가 인수한다고 발표함과 동시에 워드프레스로 플랫폼을 옮겼죠. 워드프레스오 옮긴 이후에는 호스팅 환경을 이리 저리 옮기긴 했지만 거의 18년 가까이 워드프레스를 사용해온 것 같습니다. 그 동안 워드프레스는 블로깅 툴에서 명실상부한 범용CMS로 발전했습니다. 사실 웬만한 홈페이지들은 이제

By sooop
띄어쓰기에 대한 생각

띄어쓰기에 대한 생각

업무 메일을 쓸 때 가장 많이 쓰는 말 중에 하나가 메일 말미에 ‘업무에 참고 부탁 드립니다.‘인데요, 어느 날부터 아웃룩에서 이 ‘부탁 드립니다’가 틀렸다고 맞춤법 지적을 하기 시작했습니다. 맞는 말은 ‘부탁드립니다’라고 붙여 쓰는 거라고. 사실 아래아한글 시절부터 이전의 MS워드까지, 워드프로세서들의 한국어 맞춤법 검사 실력은 거의 있으나 마나 한

By sooop

구글 포토에서 아이클라우드로 탈출한 후기

한 때 구글 포토가 백업 용량을 무제한으로 제공해 주겠다고해서, 구글 포토를 사용해서 사진을 백업해왔습니다. 물론 이 이야기의 결말은 저나 이 글을 읽고 있는 여러분이나 모두 알고 있습니다. 사실 AI에게 학습 시킬 이미지 데이터를 모으기 위한 것일 뿐이라거나 하는 이야기는 그 당시에도 있었습니다만, 에이 그래도 구글인데 용량은 넉넉하게 주겠지…하는 순진한

By sooop

Julia의 함수 사용팁

연산자의 함수적 표기 Julia의 연산자는 기본적으로 함수이며, 함수 호출 표기와 같은 방식으로 호출하는 것이 가능합니다. 또한 그 자체로 함수이기 때문에 filter(), map() 과 같이 함수를 인자로 받는 함수에도 연산자를 그대로 적용하는 것이 가능합니다. 특히 + 연산자는 sum() 함수와 같이 여러 인자를 받아 인자들의 합을 구할 수 있습니다. 2 + 3 # = 5 +(2,

By sooop