【问题标题】:How can I make window zooming respect auto layout constraints?如何使窗口缩放尊重自动布局约束?
【发布时间】:2022-06-19 15:17:18
【问题描述】:

为了简单起见,假设我有一个包含单个视图的窗口,该窗口具有自动布局约束,将所有 4 个边绑定到偏移量为 0 的窗口容器视图。假设该视图也有一个设置其纵横比的约束为一个常数值。如果我手动调整窗口大小,则窗口可以很好地保持所需的纵横比。但是,如果我单击绿色的小缩放小部件,则无论纵横比如何,窗口都会填满整个屏幕,部分视图位于屏幕顶部上方。有什么方法可以在不违反自动布局约束的情况下使窗口尽可能大地缩放?

我无法在委托方法windowWillResize:toSize: 中很好地检测到这个问题,因为这并不能告诉我它正在考虑将窗口放在哪个屏幕上。我可以尝试在 windowDidResize: 委托方法中修复窗口大小,此时我确实知道它在哪个屏幕上,但如果不重新发明自动布局的轮子,我不确定如何做到这一点。


显然有人认为我不够明确,所以我会再试一次。重现步骤:

  1. 在 Xcode 中,使用 XIB 接口创建一个新的 macOS App 项目。
  2. 打开 MainMenu.xib 并选择窗口。
  3. 将窗口重新调整为近似方形。
  4. 使用属性检查器,将窗口的全屏行为设置为辅助窗口。
  5. 将图像视图从库中拖放到窗口中。
  6. 在属性检查器中,设置图像视图以独立显示 NSComputer 图像和缩放轴。
  7. 展开图像视图以填满窗口内容区域。
  8. 选择图像视图后,单击按钮添加新的布局约束。
  9. 添加 5 个约束,将 4 个边绑定到容器,并设置纵横比。 (见屏幕截图)
  10. 构建并运行。
  11. 请注意,如果您通过拖动边或角来调整窗口大小,则纵横比保持不变。
  12. 单击窗口标题栏中的绿色缩放小部件,观察窗口在不考虑纵横比限制的情况下展开,截断了部分图像。

【问题讨论】:

  • 嗯...我对 MacOS 应用程序做的很少,但是按照您的步骤并将窗口的全屏行为设置为辅助窗口,它为我保持纵横比。您是说将其设置为Primary Window 时的意思吗?
  • @DonMag 不,当窗口的全屏行为设置为辅助窗口或无时,它绝对不会为我保持纵横比。我在 2 台不同的 Mac 上尝试过,它们都运行 Monterey。
  • 很好奇...这是我得到的:i.stack.imgur.com/4rIA9.png --- 可能是我有一些不同的默认设置吗?也许把那个基本项目放在 GitHub 上,我可以确保我运行完全相同的东西?
  • @DonMag 好的,我把项目放在on GitHub.
  • 嗯,这似乎很奇怪。如果我将纵横比设置为1:1,单击缩放按钮会将窗口缩放到整个桌面高度,但保持1:1 的宽度比例。但是...如果我使用您项目中的纵横比381:361 - 或宽度大于高度的任何比率,例如381:380 - 缩放会将窗口缩放到整个桌面,而忽略纵横比。另一方面,380:381 保持纵横比。

标签: macos cocoa autolayout window


【解决方案1】:

我刚刚完全按照您的指定设置了一个测试项目,当我调用窗口缩放小部件时,窗口扩展并保持其纵横比,即它按预期工作。我能想到的唯一可能会导致您的问题:也许您的内容拥抱和内容压缩阻力优先级与您的约束不一致?请注意,我只是将它们保留为默认值,并且效果很好。不幸的是,Mac/AppKit 开发(尤其是在使用 IB 时)充斥着这些奇怪的错误和奇怪的行为,可能是因为苹果多年来没有给予它任何爱,所以错误蔓延/溃烂,他们显然已经完成了开发UI 是“老式方式”。 (使用 SwiftUI 制作 Mac 应用程序同样令人沮丧,但方式不同,所以我会坚持我所知道的)。仅供参考,我使用 Xcode 13.4.1 创建了这个测试项目。祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多