1

我创建了一个可拖动的 NSWindow,可以通过它的内容进行拖动。它没有标题栏(无边框)。

拖动工作正常,但每隔一段时间就会出现闪烁。似乎窗口正在快速转到某个错误位置,然后返回到鼠标所在的位置(仍然按住鼠标)。它在我的 macbook 上似乎也比在我的 imac 上更好。

谁能弄清楚我做错了什么?

在初始化中,我调用了这两种方法:

[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 被调用。

4

2 回答 2

0

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

如果窗口仅由 xib 加载创建,则将上述所有代码替换为:

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

至于为什么您会看到闪烁,我最好的猜测是这是因为鼠标输入与屏幕刷新不同步,因此以编程方式使窗口跟随鼠标比仅随着每次鼠标移动而更新要复杂一些。但是如果你让 NSWindow 为你处理它,你就完全不用担心这个了。

于 2013-03-15T23:42:18.513 回答
0

你得到一个 NSWindowDidMove 通知但不是 live

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

请参阅鼠标移动窗口时如何接收通知?有关如何做到这一点的一些链接

于 2013-03-17T16:11:24.700 回答