2017-04-15 75 views
0

我有一個彈出式窗口的一部分,我用線畫出了一個自定義光標。因此,我不希望標準光標顯示在某個區域內(isInDiagram)。取消隱藏光標滯後

這是我的代碼:

- (void)mouseMoved:(NSEvent *)theEvent { 
    position = [self convertPoint:[theEvent locationInWindow] fromView:nil]; 
    if(![self isInDiagram:position]) { 
     [NSCursor unhide]; 
    } 
    else{ 
     [NSCursor hide]; 
    } 
    [self setNeedsDisplay: YES]; 
} 

- (bool) isInDiagram: (NSPoint) p { 
    return (p.x >= bborder.x + inset) && (p.y >= bborder.y + inset) && 
    (p.x <= self.window.frame.size.width - bborder.x - inset) && 
    (p.y <= self.window.frame.size.height - bborder.y - inset); 
} 

現在隱藏光標工作完全正常,但總是滯後取消隱藏。我無法弄清楚什麼最終會觸發光標再次顯示。但是,如果我循環取消隱藏命令取消隱藏工作:

for (int i = 0; i<100; i++) { 
    [NSCursor unhide]; 
} 

我怎麼能解決這個問題,而使用這個uggly循環任何想法?

回答

2

從文檔:

取消隱藏的每次調用必須由隱藏的調用在 爲了使光標顯示平衡是正確的。

當您移動鼠標時,它會多次隱藏。如果光標不是已經隱藏,而只是隱藏,則需要標記。它應該只隱藏一次。

- (void)mouseMoved:(NSEvent *)theEvent { 
    position = [self convertPoint:[theEvent locationInWindow] fromView:nil]; 
    BOOL isInDiagram = [self isInDiagram:position] 
    if(!isInDiagram && !CGCursorIsVisible()) { 
     [NSCursor unhide]; 
    } 
    else if (isInDiagram && CGCursorIsVisible()){ // cursor is not hidden 
     [NSCursor hide]; 
    } 
    [self setNeedsDisplay: YES]; 
} 

注意CGCursorIsVisible已被棄用,你可以保持自己的標誌,以跟蹤光標隱藏狀態。

+0

謝謝你的回答。你寫的東西讓你感覺很舒服,但如果我嘗試你的代碼,當我移動鼠標時,光標會閃爍,當我停止移動它時,光標有時會被隱藏,有時不會。 此外xCode告訴我,CGCursorIsVisible()已棄用:https://developer.apple.com/reference/coregraphics/1541812-cgcursorisvisible 編輯:我必須 - 當然 - 檢查光標是否在圖中再次elese if語句:else if([self isInDiagram:position] && CGCursorIsVisible());非常感謝你! – user7408924

+1

@ user7408924我知道它已被棄用。您可以使用自己的旗子來維護旗幟。對不起,我正在編輯我的閃爍答案。請檢查編輯答案 – codester

+0

我剛剛注意到。謝謝 :) – user7408924