Mac 窗口不会让我调整到更小,可能是限制?

Posted

技术标签:

【中文标题】Mac 窗口不会让我调整到更小,可能是限制?【英文标题】:Mac Window Won't Let Me Resize to Smaller, possibly constraints? 【发布时间】:2015-03-20 23:43:12 【问题描述】:

我对出了什么问题并不肯定,但我的猜测是它与约束有关。

当我尝试调整 NSWindow 的大小时,我可以毫无问题地将其放大。但是,当我尝试使其更小时,窗口根本不会改变大小。窗口中很少有元素具有固定大小的约束。总固定宽度只有 120 左右,我的窗口大约 700 宽,所以我没有遇到固定宽度问题。事实上,如果我把窗口拖到 800 宽,那么它的最小尺寸就变成了 800。

我的猜测是,一旦视图大小增加,他们就不想压缩回去。但这只是猜测。

知道如何解决这个问题吗?抱歉,我无法提供任何代码,但我没有涉及任何代码。这只是我的 xib 中的约束。

编辑:

我将[self.window.contentView constraintsAffectingLayoutForOrientation:NSLayoutConstraintOrientationHorizontal] 的NSLog 添加到- (void)windowDidResize:(NSNotification *)notification。起初,窗口让我将其大小调整得越来越小,这就是输出的样子:

2015-03-20 17:41:40.097 10bii Financial Calculator[19780:561394] windowDidResize Constraints: (
    "<NSAutoresizingMaskLayoutConstraint:0x600000081d10 h=-&- v=-&- H:|-(0)-[NSView:0x618000121400]   (Names: '|':NSThemeFrame:0x100902d90'10bii Financial Calculator' )>",
    "<NSAutoresizingMaskLayoutConstraint:0x600000081d60 h=-&- v=-&- H:[NSView:0x618000121400]-(0)-|   (Names: '|':NSThemeFrame:0x100902d90'10bii Financial Calculator' )>",
    "<NSLayoutConstraint:0x6180000856e0 'NSWindow-current-width' H:[NSThemeFrame:0x100902d90'10bii Financial Calculator'(872@500)] priority:500>"
)

然后,在几次调整大小后,窗口停止允许我将其变小,这是约束日志的输出:

2015-03-20 17:42:03.506 10bii Financial Calculator[19780:561394] windowDidResize Constraints: (
    "<NSAutoresizingMaskLayoutConstraint:0x600000081d10 h=-&- v=-&- H:|-(0)-[NSView:0x618000121400]   (Names: '|':NSThemeFrame:0x100902d90'10bii Financial Calculator' )>",
    "<NSLayoutConstraint:0x60800008d570 H:|-(0)-[ViewWithBackground:0x608000142c00]   (Names: '|':NSView:0x618000121400 )>",
    "<NSLayoutConstraint:0x60800008d520 H:[ViewWithBackground:0x608000142c00]-(0)-|   (Names: '|':NSView:0x618000121400 )>",
    "<NSLayoutConstraint:0x6080000829e0 H:[NSTextField:0x608000180dd0]-(20)-[NSTextField:0x608000180d00]>",
    "<NSLayoutConstraint:0x608000082940 NSTextField:0x608000180dd0.width == 3*NSTextField:0x608000180d00.width>",
    "<NSLayoutConstraint:0x608000082850 NSTextField:0x608000180dd0.width == 3*NSTextField:0x608000180c30.width>",
    "<NSLayoutConstraint:0x608000082800 NSTextField:0x608000180dd0.width == 3*NSTextField:0x608000180b60.width>",
    "<NSLayoutConstraint:0x6080000827b0 NSTextField:0x608000180dd0.width == 3*NSTextField:0x608000180a90.width>",
    "<NSLayoutConstraint:0x608000082ad0 H:[NSTextField:0x608000180d00]-(20)-[NSTextField:0x608000180c30]>",
    "<NSLayoutConstraint:0x6080000828f0 NSTextField:0x608000180dd0.width == 3*NSTextField:0x6080001809c0.width>",
    "<NSLayoutConstraint:0x608000082b70 H:[NSTextField:0x608000180c30]-(20)-[NSTextField:0x608000180b60]>",
    "<NSLayoutConstraint:0x6080000828a0 NSTextField:0x608000180dd0.width == 2*NSTextField:0x6080001808f0.width
+ 3>",
    "<NSLayoutConstraint:0x608000082c10 H:[NSTextField:0x608000180b60]-(20)-[NSTextField:0x608000180a90]>",
    "<NSLayoutConstraint:0x608000082cb0 H:[NSTextField:0x608000180a90]-(20)-[NSTextField:0x6080001809c0]>",
    "<NSLayoutConstraint:0x608000082d00 H:[NSTextField:0x6080001809c0]-(20)-[NSTextField:0x6080001808f0]>",
    "<NSLayoutConstraint:0x60800008d110 H:|-(20)-[NSTextField:0x608000180dd0]   (Names: '|':ViewWithBackground:0x608000142c00 )>",
    "<NSLayoutConstraint:0x60800008d340 H:[NSTextField:0x6080001808f0]-(20)-|   (Names: '|':ViewWithBackground:0x608000142c00 )>" )

这是窗口的样子:

【问题讨论】:

【参考方案1】:

可能您窗口中的某些视图具有固有的内容大小,并且具有大于或等于 500 (NSLayoutPriorityWindowSizeStayPut) 的抗压缩优先级。降低抗压优先级,这将使窗口更小。

如果这还不够清楚,您将不得不显示窗口的视图层次结构中有哪些约束。

【讨论】:

我已将我的 xib 中的每个视图都发送到内容压缩阻力优先级 = 250,但问题仍然存在。你希望我如何展示我的约束?窗户里有很多风景。 :// 您可以在 IB 中展开文档大纲并发布约束的屏幕截图。确保将拆分视图分隔线拖得足够宽以显示细节。您也可以尝试在某个战略点记录[self.window.contentView constraintsAffectingLayoutForOrientation:NSLayoutConstraintOrientationHorizontal] 并发布结果。 添加了日志!谢谢!【参考方案2】:

@Ken Thomases 的日志记录建议 ...

[self.window.contentView constraintsAffectingLayoutForOrientation:NSLayoutConstraintOrientationHorizontal]

能够为我提供有关哪些视图导致问题的线索。我在窗口的一行中有 7 个文本标签。他们中的大多数应该是等宽的,但每一端的一个更大。第一个是其他的 3 倍,最后一个是其他的 2 倍。

当我最初设置约束时,我选择了所有约束并应用了等宽约束,然后我修改了乘数。我注意到 3x 标签是所有其他标签都是 EqualWidth'd 的视图。我担心这会导致安排过于复杂。所以我删除了这些约束,一次重新应用一个,并确保所有相同大小的标签都相互键控,然后将 3x 键控到 1x 标签之一。

一旦我这样做了,问题就消失了。不完全确定为什么,但也许这个描述会对其他人有所帮助。

【讨论】:

很高兴你知道了。是的,我也关注那些宽度限制。在一种情况下,不是 3x 乘数,而是 2 的乘数和 3 的常数(即 2x + 3),这可能导致了问题。 嘎……我对这些约束所做的任何改变现在都给我带来了更多的问题。我其余视图中的动画很粗,我注意到这些标签在动画期间抽搐。我删除了这些标签上的约束,我的动画流畅地移动。布雷格。

以上是关于Mac 窗口不会让我调整到更小,可能是限制?的主要内容,如果未能解决你的问题,请参考以下文章

调整窗口大小时带有约束的宽度限制

怎样限制WPF只能打开一个相同界面

Python中的枕头不会让我打开图像(“超过限制”)

JS如何设置并限制浏览器窗口的大小

Xamarin UWP 应用程序不限制用户在 150(推荐)分辨率下将窗口大小调整为较小的大小

在窗口范围内限制/移动上下文菜单(右键单击)