2013-03-08 33 views
1

我創建了一個可拖動的NSWindow,可以通過它的內容拖動。它沒有標題欄(無邊框)。Draggable NSWindow閃爍

拖動工作正常,但每隔一段時間都會有閃爍。看起來窗口很快就會出現錯誤的位置,然後返回到鼠標所在的位置(仍然保持鼠標不動)。它似乎也可以在我的MacBook上運行,然後在我的imac上運行。

任何人都可以弄清楚我做錯了什麼嗎?

在init我稱這兩種方法:

[self setMovableByWindowBackground:YES]; 
[self setMovable:YES]; 

這些被使用的變量:

NSPoint currentLocation; 
NSPoint newOrigin; 
int offsetX,offsetY; 

,這裏是關於拖碼:

- (void)mouseMoved:(NSEvent *)theEvent{ 
} 


- (void)mouseDown:(NSEvent *)theEvent{ 

    currentLocation = [self convertBaseToScreen:[self mouseLocationOutsideOfEventStream]]; 

    offsetX = currentLocation.x - [self frame].origin.x; 
    offsetY = currentLocation.y - [self frame].origin.y; 
} 

- (void)mouseDragged:(NSEvent *)theEvent{ 
    currentLocation = [self convertBaseToScreen:[self mouseLocationOutsideOfEventStream]]; 

    newOrigin.x = currentLocation.x - offsetX; 
    newOrigin.y = currentLocation.y - offsetY; 

    [self setFrameOrigin:newOrigin]; 

} 

編輯:好的,如上所述,這是一個透明的無邊界NSPanel。是的,我似乎不需要上面的代碼。

但是,我確實需要拖動窗口的位置,我需要它不斷。

如果我剛剛得到的幀起源,像這樣:

self.frame.origin 

此報告的數量不正確。可可更新此內部價值似乎需要一些時間。

其次,面板是非激活的。它在第一次調用它時加載(焦點)和mouseDragged時正常運行。但是,當我與另一個應用程序交互,然後返回時不行。只有mouseDown和mouseUp被調用。

回答

0

如果-setMovableByWindowBackground:正在被調用,則您的鼠標跟蹤代碼不是必需的;你基本上只是複製這項工作。從它的聲音中,我會說你的-init方法沒有被調用,很可能是因爲你是從一個.xib加載(而不是調用-initWithCoder:)。

如果完全由廈門國際銀行加載創建的窗口,你只用這個代替上述所有代碼:

- (void)awakeFromNib 
{ 
    [self setMovableByWindowBackground:YES]; 
} 

至於爲什麼你看到的閃爍,我最好的猜測是,這是因爲鼠標輸入沒有同步到屏幕刷新,因此編程式地製作一個窗口跟隨着鼠標,這比用每個鼠標移動更新要複雜一點。但是如果你讓NSWindow爲你照顧它,你根本不需要擔心。

+0

順便說一下,'[自setMovable:YES]'也是不必要的,除非你將其設置爲NO別處 - 默認值是YES。 – 2013-03-15 23:45:01

+0

AFAIK,有必要(重新)爲使用'NSBorderlessWindowMask'的窗口實現鼠標跟蹤/移動代碼。它看起來像這樣的代碼是基於蘋果的'RoundTransparentWindow'示例代碼:https://developer.apple.com/library/mac/#samplecode/RoundTransparentWindow/Listings/Classes_CustomWindow_m.html#//apple_ref/doc/uid/DTS10000401- Classes_CustomWindow_m-DontLinkElementID_8。我也認爲''initWithCoder:'事物適用於除了'NSWindow'之外的所有事物,因爲它不支持''。 – NSGod 2013-03-16 00:18:42

+0

這是正確的,它是一個透明的無邊框窗口。對不起,沒有提及!然而,它似乎沒有mousedragged/mousedown代碼工作(移動)。但是,我首先使用該代碼的原因是,在拖動拖曳的同時,對拖拽的位置做了一些處理。可可似乎沒有正確報告框架的原點,而拖動(它報告正確的數字滯後一點)。我會在五分鐘內更新我的問題,並提供更多信息。 – Wesley 2013-03-17 13:24:02