2014-01-29 49 views
0

我有一個遊標對象,我希望能夠告訴它什麼時候與nsbutton相交,以及它是否連續3秒。我的代碼工作除了當光標靠近一個按鈕,它凍結,直到它已經三秒鐘,然後記錄「按鈕重疊3秒」。檢查nsbutton是否相交了一定的秒數

NSDate* date; 
    -(BOOL)checkIfIntersects :(NSButton*)button { 

     BOOL intersects = CGRectIntersectsRect (cursor.frame,button.frame); 

     if (intersects) { 
     date = [NSDate date]; 

     while (intersects) { 
      if ([date timeIntervalSinceNow] < -1) 
      { 
       NSLog(@"Button overlapped for 3 seconds"); 

       break; 
      } 
      intersects = CGRectIntersectsRect (cursor.frame,button.frame);  
     } 

    } 

    return NO; 

} 
+0

'NSTrackingRect' –

回答

1

這是因爲你的線程卡在while(intersects)循環中,後的內部if語句只感到滿意離開。這將掛起你的整個線程。

對於您來說最快/最簡單的解決方案應該是在您的功能之外有一個交互標誌以及您的NSDate

NSDate* momentIntersectionBegan = nil; 
    BOOL intersectedPreviously = false; 

    -(BOOL)checkIfIntersects :(NSButton*)button { 
    BOOL currentlyIntersects = CGRectIntersectsRect (cursor.frame,button.frame); 

    if (currentlyIntersects) { 
    if(intersectedPreviously){ 
     if ([momentIntersectionBegan timeIntervalSinceNow] < -3) 
     { 
      NSLog(@"Button overlapped for 3 seconds"); 
     } 
    }else{ 
     momentIntersected = [NSDate date]; 
    } 
     intersectedPreviously = true; 
    }else{ 
     intersectedPreviously = false; 
    } 

return NO; 

} 
+0

現在不凍結,而是「按鈕重疊」從未發生 – user3247022

+0

不要我在多次現在叫checkIfIntersects,因爲它不再是一個循環? – user3247022

+0

我上面寫的代碼將會跟蹤最後一次按鈕的相交時間,前一次調用中是否檢測到交叉點,以及是否始終檢測到交叉點三秒鐘。我寫它假設這個方法將被調用每一個tick,就像它是從一個重複的'NSTimer'中調用,或者在一個遊戲循環中。最好的解決方案取決於你的整體實施。 – Andrew