Objective c NSWindow标题栏的右半部分不可拖动

Objective c NSWindow标题栏的右半部分不可拖动,objective-c,cocoa,macos,nswindow,Objective C,Cocoa,Macos,Nswindow,我有一个NSWindow的实例,可以通过编程(使用setFrame)调整大小。创建时,其默认大小为50x50。然后我调用setFrame将其调整为350x450:一切正常,我可以随意拖动窗口。然后,在程序的后面,我将其调整为1024x768。此时,标题栏中唯一可以拖动的部分是前350个像素:左侧部分。如果我拖动正确的部分,什么也不会发生。好像标题栏仍然认为窗口具有以前的大小 已更新(添加了设置帧的代码): 以下是输出: 2011-05-04 08:50:47.313 ClientProMac[2

我有一个NSWindow的实例,可以通过编程(使用setFrame)调整大小。创建时,其默认大小为50x50。然后我调用setFrame将其调整为350x450:一切正常,我可以随意拖动窗口。然后,在程序的后面,我将其调整为1024x768。此时,标题栏中唯一可以拖动的部分是前350个像素:左侧部分。如果我拖动正确的部分,什么也不会发生。好像标题栏仍然认为窗口具有以前的大小

已更新(添加了设置帧的代码):

以下是输出:

2011-05-04 08:50:47.313 ClientProMac[2461:a0f] Frame Before setsize: cur Size(50.000000, 72.000000) 
2011-05-04 08:50:47.340 ClientProMac[2461:a0f] Frame After setsize: cur Size(350.000000, 472.000000) new val(350, 450)
2011-05-04 08:50:49.148 ClientProMac[2461:7003] Frame Before setsize: cur Size(350.000000, 472.000000) 
2011-05-04 08:50:49.160 ClientProMac[2461:7003] Frame After setsize: cur Size(1024.000000, 790.000000) new val(1024, 768)
奇怪的是,如果我随后通过拖动窗口的角来调整窗口的大小,完整的标题栏将再次变为可拖动:错误消失了

以前有人见过这种行为吗?是什么原因导致的,我如何修复它

谢谢。

NSWindow(以及cocoa中的大多数GUI操作)不是线程安全的。确保正在调整主线程上的窗口大小

例如:

NSRect frame = NSMakeRect(42, 42, 420, 420);
dispatch_sync(dispatch_get_main_queue(), ^{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [window setFrame:frame];
    [pool release];
});

如果您需要向后兼容并且不想使用GCD,可以使用-[NSObject performSelectorOnMainThread:withObject:waitUntilDone:]。

您应该包括调整窗口大小以及从何处调用窗口的代码。可能是窗口的大小调整导致了这个错误。乔希:屏幕的大小似乎并不影响这个。我有一个双显示器(都是1280x1024)和单显示器(1280x1024和1024x768)的错误。我同意jslap,什么时候调用你的“_setSize”方法?很可能是在无法安全调整窗口大小的情况下调整大小。你发布的代码没有问题,所以它必须取决于之前/之后发生了什么。你为什么要创建自己的自动发布池?这没什么错,但它表明你是在一个背景线程或什么?NSWindow不太可能是线程安全的。是。我是用另一种思路做的。我认为窗户是线程安全的。我只是在主线程中做了,它就不见了@想写一个答案,这样我就可以把它标记为已回答?
NSRect frame = NSMakeRect(42, 42, 420, 420);
dispatch_sync(dispatch_get_main_queue(), ^{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [window setFrame:frame];
    [pool release];
});