Macos 重新打开应用程序时,如何在不引起问题的情况下恢复缩放状态?

Macos 重新打开应用程序时,如何在不引起问题的情况下恢复缩放状态?,macos,Macos,如果用户缩放我们的应用程序的主窗口,关闭应用程序,然后重新打开它,我们希望恢复主窗口的最后状态,因此我们在显示窗口之前缩放它。应用程序打开时缩放,所以一切都很好 但是,如果用户再次单击缩放按钮,则不会发生任何事情。我相信这是因为第5步的说明: 确定新帧。如果该窗口当前在标准中 状态,新帧表示用户状态,在 上一次缩放。如果窗口当前处于用户状态,则新的 帧表示在上述步骤1中计算的标准状态。如果 没有保存的用户状态,因为以前没有缩放, 窗口的大小和位置不会更改 我认为它不会取消缩放,因为没有用户状态,

如果用户缩放我们的应用程序的主窗口,关闭应用程序,然后重新打开它,我们希望恢复主窗口的最后状态,因此我们在显示窗口之前缩放它。应用程序打开时缩放,所以一切都很好

但是,如果用户再次单击缩放按钮,则不会发生任何事情。我相信这是因为第5步的说明:

确定新帧。如果该窗口当前在标准中 状态,新帧表示用户状态,在 上一次缩放。如果窗口当前处于用户状态,则新的 帧表示在上述步骤1中计算的标准状态。如果 没有保存的用户状态,因为以前没有缩放, 窗口的大小和位置不会更改

我认为它不会取消缩放,因为没有用户状态,但我不确定为什么-用户状态不应该是“缩放前的窗口大小”?如果没有,如何确保用户状态设置正确,以便在用户再次单击缩放按钮时窗口取消缩放


编辑:戈麦斯先生在下面回应说,这基本上就是它的工作原理。不过,其他应用程序的行为似乎并非如此。尝试Safari-缩放它,然后退出,然后重新打开窗口,它将恢复为缩放大小。单击“缩放”按钮,它将返回到较小的大小。我也一样。这些应用程序是如何做到的?

问题是,这是预期的行为。正如你在这里提到的:

我们想恢复主窗口的最后状态,所以我们缩放它 在展示橱窗之前

您已经将用户视图设置为标准视图。原始默认视图尚未保留

详细介绍了
zoom:
的预期功能。引用公认的答案:

根据
缩放:
方法(注意
)的文档
zoom:
的反方向是
zoom:

此操作方法可在两个窗口之间切换窗口的大小和位置 其标准状态(由应用程序提供为“最佳”尺寸 显示窗口的数据)及其用户状态(新的大小和位置 用户可能已通过移动或调整窗口大小进行了设置)

如果它处于用户状态(未缩放),它将更改为标准 状态(缩放),如果它处于标准状态(缩放),它将更改 到用户状态(取消缩放)

文件还指出:

如果没有保存的用户状态,因为没有以前的 缩放时,窗口的大小和位置不会更改

这就是如果您以其标准方式启动窗口将发生的情况 国家;因为它从来没有在任何其他州,所以它没有任何意义 取消缩放到

问题是你已经超越了标准状态<代码>缩放:的目的是在用户视图和界面标准视图之间切换。要保存用户的窗口状态以备以后恢复,请执行以下操作

并且,为了便于参考,这里是的其余部分,以及您应该如何使用此限制


编辑:如前所述,这也是一个UI模式的问题,OSX窗口可能是双模(用户状态,最大化状态)或三模(用户状态,标准状态,最大化状态),当应用程序以最大化状态关闭时,用户状态会丢失。这似乎在OSX的库存标准应用程序中重现,例如


因此,这里所能做的最好的事情就是定义一个与OSX应用程序一致的功能性UI范例,但包含许多相同的范例

不过,其他应用程序的行为似乎并非如此。尝试Safari-缩放它,然后退出,然后重新打开窗口,它将恢复为缩放大小。单击“缩放”按钮,它将返回到较小的大小。我也一样。那些应用程序是如何做到的?@Colen就我所知,它们正在做到。我将用这个更新我的答案,因为没有它就不合适了。好的,我创建了一个小的测试应用程序,它只在启动/关闭时调用setFrameUsingName/saveFrameUsingName来保存和恢复窗口位置。如果我启动它,将它移动到屏幕上的其他位置,关闭它,然后重新启动它,新位置将恢复。如果我缩放它,关闭它,然后重新启动它,缩放的位置将恢复。到目前为止,一切如期而至。但是,如果我点击zoom取消缩放,它将取消缩放到默认窗口位置,而不是我使用的新窗口位置。我对这种行为没意见-知道怎么触发吗?谢谢你迄今为止的帮助@Colen这是因为在触发缩放时,您从用户视图切换到界面的标准视图。不用说,对于OSX中的大多数UI开发人员来说,这是非常令人惊讶的行为!不幸的是,这将要求您将标准界面视图设置为用户指定的新位置,这对于那些习惯OSX样式指南和窗口行为的人来说可能同样令人惊讶。因此,我将设计决定权留给您:您是将标准视图设置为用户所需的位置,还是保持原样?对不起,当我说我缩放了窗口时,我的意思是我在应用程序的UI中单击了绿色的“缩放”按钮。我根本没有在代码中调用“zoom:”——我所做的只是单击UI中的按钮。因此,除了以操作系统标准方式保存和恢复位置外,我没有在代码中对位置/维度进行任何操作。这有意义吗?