2012-07-02 4 views
7

마우스를 드래그하는 동안 커서를 놓을 수없는 이유는 무엇입니까? 드래그를 시작하자마자, "화살표"로 되돌아갑니다 (실행 후 앱 델리게이트로 오픈 핸드로 설정 했음에도 불구하고).NSCursor가 항상 화살표로 재설정됩니다.

- (void)mouseDown:(NSEvent *)event 
{ 
    [[NSCursor closedHandCursor] push]; 
} 

- (void)mouseUp:(NSEvent *)event 
{ 
    [NSCursor pop]; 
} 

답변

10

addCursorRect:cursor:을 사용하여 볼 수 있도록 커서를 설정해보십시오.

이보기에 대한 resetCursorRects을 무시

:

- (void)resetCursorRects 
{ 
    [super resetCursorRects]; 
    if(drag) { 
     [self addCursorRect:self.bounds cursor:[NSCursor closedHandCursor]]; 
    } 
} 

을 당신은 당신의 커서의 구형 업데이트 강제로 invalidateCursorRectsForView:를 호출해야합니다

[self.window invalidateCursorRectsForView:self]; 

을하지만 당신은 당신을 볼 이외의 다른 커서를 갖고 싶어 mouseDragged: 방법에서 [[NSCursor closedHandCursor] set]으로 전화 할 수 있습니다.

+0

오! 나는 이것과 같은 것을 보았지만, 내가 * 추가하기를 원하는 * 것에 대해 * 재설정 *을 무시하는 것은 어리석은 것처럼 보였다. 지금 커서 위치를 변경할 때 커서 rect가 무효화됩니다. 감사. – borrrden

+2

addCursorRect의 인수는'[self frame]'이 아니라'[self bounds]'입니다. – alecail

14

당신이 -mouseDown에서 할 수있는 드래그하는 동안 다른 뷰가 커서를 변경하지 않으려면 :

[[self window] disableCursorRects]; 

및 -mouseUp의 :

[[self window] enableCursorRects]; 
[[self window] resetCursorRects]; 
+3

이 작업을 수행하려면 mouseUp이 실제 트리거되었는지 확인하십시오. NSTableView 및 다른 유형의 뷰에서도 mouseDown에서 base를 호출하면 mouseUp이 더 이상 트리거되지 않습니다. 이는 기본 메커니즘이 이벤트를 도용하여 "소비"하기 때문입니다. 입력/종료 된 마우스에서 이것을 사용하면 좋은 해결책이 될 수도 있습니다. –

관련 문제