我創建了一個可拖動的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被調用。
順便說一下,'[自setMovable:YES]'也是不必要的,除非你將其設置爲NO別處 - 默認值是YES。 – 2013-03-15 23:45:01
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
這是正確的,它是一個透明的無邊框窗口。對不起,沒有提及!然而,它似乎沒有mousedragged/mousedown代碼工作(移動)。但是,我首先使用該代碼的原因是,在拖動拖曳的同時,對拖拽的位置做了一些處理。可可似乎沒有正確報告框架的原點,而拖動(它報告正確的數字滯後一點)。我會在五分鐘內更新我的問題,並提供更多信息。 – Wesley 2013-03-17 13:24:02