2015-05-28 109 views
2

我的應用程序中有一個NSView的自定義子類。 我想知道視圖中與鼠標點擊相關的確切點。 (即,不是相對於窗口原點,而是相對於自定義視圖原點)。什麼是計算鼠標點擊的正確方法

我一直用這個,已經完美工作:

-(void)mouseDown:(NSEvent *)theEvent 
{ 
    NSPoint screenPoint = [NSEvent mouseLocation]; 
    NSPoint windowPoint = [[self window] convertScreenToBase:screenPoint]; 
    NSPoint point = [self convertPoint:windowPoint fromView:nil]; 

    _pointInView = point; 

    [self setNeedsDisplay:YES]; 
} 

但現在我得到一個警告,convertScreenToBase已被棄用,使用convertRectFromScreen代替。然而,我無法從convertRectFromScreen獲得相同的結果,無論如何,我對一個點感興趣,而不是一個正確的!

我應該如何正確替換上面的棄用代碼? 在此先感謝!

回答

1

我找到了解決辦法:

NSPoint screenPoint = [NSEvent mouseLocation]; 
NSRect screenRect = CGRectMake(screenPoint.x, screenPoint.y, 1.0, 1.0); 
NSRect baseRect = [self.window convertRectFromScreen:screenRect]; 
_pointInView = [self convertPoint:baseRect.origin fromView:nil]; 
+0

與Max的答案唯一真正的區別似乎是使用1.0而不是0來表示矩形尺寸。 – Kenny

2

我用一個窗口製作了一個示例項目,並測試了「舊」和新的場景。兩種情況下的結果都是一樣的。

你必須做一個額外的步驟:用screenPoint作爲原點創建一個簡單的矩形。然後使用新的返回矩形的原點。

這是新代碼:

-(void)mouseDown:(NSEvent *)theEvent 
{ 
    NSPoint screenPoint = [NSEvent mouseLocation]; 
    NSRect rect = [[self window] convertRectFromScreen:NSMakeRect(screenPoint.x, screenPoint.y, 0, 0)]; 

    NSPoint windowPoint = rect.origin; 
    NSPoint point = [self convertPoint:windowPoint fromView:nil]; 

    _pointInView = point; 

    [self setNeedsDisplay:YES]; 
} 

我希望我能夠幫到你!

+0

嗯。你的代碼和我的代碼給出了完全不同的結果! [rect origin]應該是rect.origin,因爲NSRect不是一個類。 – Kenny

+0

你是對的,rect.origin,那是我的錯。我會再看看它! – mangerlahn

+0

視圖位於哪裏?它可能在翻轉的座標系中 – mangerlahn

4

這條線從您的代碼:

NSPoint screenPoint = [NSEvent mouseLocation]; 

獲取鼠標光標的位置不同步的事件流。這不是你正在處理的事件的位置,這是過去很短的時間;這是光標現在的位置,這意味着你可能會跳過一些重要的東西。您應該幾乎總是使用與事件流同步的位置。

爲此,請使用您的方法接收的theEvent參數。 NSEvent有一個locationInWindow屬性,該屬性已被轉換爲接收它的窗口的座標。這消除了您對其進行轉換的需求。

NSPoint windowPoint = [theEvent locationInWindow];  

將窗口位置轉換爲視圖座標系的代碼很好。

相關問題