Xcode Cocoa:防止窗口离开屏幕

Xcode Cocoa:防止窗口离开屏幕,xcode,macos,cocoa,Xcode,Macos,Cocoa,我正在(重新)编写一个控制USB设备的小应用程序。我希望该应用程序的窗口始终完全可见。因此,当你在窗口周围移动时,当底部碰到屏幕底部或一侧碰到屏幕一侧时,窗口停止移动 - (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen { if (((self.frame.origin.x + self.frame.size.width) > screen.frame.size.width) &

我正在(重新)编写一个控制USB设备的小应用程序。我希望该应用程序的窗口始终完全可见。因此,当你在窗口周围移动时,当底部碰到屏幕底部或一侧碰到屏幕一侧时,窗口停止移动

- (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen
{
    if (((self.frame.origin.x + self.frame.size.width) > screen.frame.size.width) && (screen.frame.size.width > 0))
    {
        frameRect.origin.x = (screen.frame.size.width - self.frame.size.width);
    }

    if (self.frame.origin.y < 0)
    {
        frameRect.origin.y = 0;
    }

    return frameRect;
}
这有可能吗?

是的,有可能。 带有标题栏的普通窗口约束自己的框架,使窗口顶部不能离开屏幕顶部。这是在
-[NSWindow constraintframerect:toScreen:]中完成的。

您可以替代此方法以按自己的意愿约束框架

如果要阻止用户自由移动窗口,只需创建一个没有标题栏的自定义窗口即可。有一个标题栏向用户表明窗口可以移动,因此这里的解决方案是没有标题栏。那么,移动它就没有控制权了。您需要提供自己的控件来关闭窗口。

由于Dropbox链接不再提供所提供的代码示例,我认为分享我的解决方案会很有用。对于我的项目,我只需要担心屏幕的底部和右侧,但是其他人应该能够调整它来考虑屏幕的顶部和左侧

- (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen
{
    if (((self.frame.origin.x + self.frame.size.width) > screen.frame.size.width) && (screen.frame.size.width > 0))
    {
        frameRect.origin.x = (screen.frame.size.width - self.frame.size.width);
    }

    if (self.frame.origin.y < 0)
    {
        frameRect.origin.y = 0;
    }

    return frameRect;
}
-(NSRect)约束frameRect:(NSRect)frameRect到屏幕:(NSScreen*)屏幕
{
if(((self.frame.origin.x+self.frame.size.width)>screen.frame.size.width)&(screen.frame.size.width>0))
{
frameRect.origin.x=(screen.frame.size.width-self.frame.size.width);
}
if(自帧原点y<0)
{
frameRect.origin.y=0;
}
返回frameRect;
}

查看了这个方法,我不确定是否完全理解它,但我会尝试一下。当然,随时可实施的解决方案总是受欢迎的…;-)坦克,ArjenYou问这是可能的。答案是肯定的。谷歌搜索该方法;我相信你会发现人们为了同样的目的使用它。是的,我正在努力。但这并不意味着一个现成的解决方案不受欢迎……好吧,所以我试着否决ConstraintFrameRecttoScreen,但我必须做些错事。即使我尝试将原点设置为(0,0),我仍然可以自由移动窗口。。谷歌没有给我举一个我能理解的例子。谢谢,但这不是我想要的。我只希望窗口不能移出屏幕。这是一款应用程序,可以控制我度假别墅里的东西,运行在本地Mac电脑上。在途中,我通过iPhone通过VNC访问此应用程序。我在手机上的响应速度很慢,这已经够难的了,但是当有人将应用程序移出屏幕时,几乎不可能将其取回。因为我使窗口浮动,所以很容易找到,所以我还需要能够移动它,以便看到其他应用程序正在运行。然后,我在另一个答案中提到的方法就是您所需要的。只需创建一个NSWindow子类并实现此方法。确保您的窗口是Interface Builder中的子类。据我所知,这就是我所做的。我在IB中将窗口命名为appWindow,并尝试了各种方法来覆盖frameRectToScreen(包括将原点固定在0,0),但都没有起到任何作用。该窗口仍然可以自由移动到任何地方…不知何故,(Mountain)Lion中的自动恢复功能推翻了所有定位设置。当我将“[appWindow setFrameOrigin:NSMakePoint(0,0)];放入awakeFromNib中时(作为该函数中的最后一行)它会将窗口保持在上次关闭应用程序时的位置,忽略我的setFrameOrigin。这正是我尝试覆盖frameRectToScreen时发生的情况……我成功覆盖了标准的Lion还原设置(NSUserDefaults)所以现在我的窗口从我把它放在awakeFromNib的地方开始。覆盖FrameDirectToScreen仍然没有任何作用。。。