Draggable NSWindow闪烁

时间:2013-03-08 14:32:05

标签: objective-c xcode cocoa nsview nswindow

我创建了一个可拖动的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

报告的号码不正确。在cocoa更新此内部值之前似乎需要一些时间。

其次,该小组是非激活的。它在第一次加载(聚焦)并且正在调用mouseDragged时移动它时工作正常。但是当我与另一个应用程序交互然后返回时。只调用了mouseDown和mouseUp。

2 个答案:

答案 0 :(得分:0)

如果调用-setMovableByWindowBackground:,则无需使用鼠标跟踪代码;你基本上只是重复那项工作。从它的声音来看,我说你的-init方法没有被调用,很可能是因为你是从.xib(它调用-initWithCoder:)加载的。

如果窗口是由xib加载专门创建的,则只需使用以下代码替换所有上述代码:

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

至于为什么你会看到一个闪烁,我最好的猜测是因为鼠标输入没有与屏幕刷新同步,所以以编程方式制作一个跟随鼠标的窗口比仅仅用鼠标移动更新要复杂一点。但如果你让NSWindow为你照顾它,你根本不需要担心。

答案 1 :(得分:0)

你获得了NSWindowDidMove通知但不是

如果您需要实时更新,默认情况下这是不可能的AFAIK。 调整大小时,相同,框架不会更新。

请参阅How to receive notifications when moving Window by mouse?了解有关如何执行此操作的一些链接