【问题标题】:Change size of window in Cocoa?改变可可窗口的大小?
【发布时间】:2012-09-07 02:29:52
【问题描述】:

我有一个窗口,当用户点击它时我需要改变它的大小。我正在使用[self setFrame:windowFrame display:YES animate:YES] 来完成此操作。

即使窗口成功地改变了大小(我增加了它的高度),它也会随着它向上移动窗口的内容。我该如何防止这种情况发生?我希望内容保持不变。

我在 OSX Mountain Lion 上使用 Objective-C 和 Cocoa 为 OSX 开发应用程序。

编辑:约束和/或弹簧和支柱将不起作用,因为我需要在调整窗口大小后移动内容。

【问题讨论】:

    标签: objective-c macos cocoa user-interface


    【解决方案1】:

    约束和/或弹簧和支柱将不起作用,因为我需要在调整窗口大小后移动内容。

    在这种情况下,您应该使用NSViewAnimation。

    一个视图动画实际上可以对多个视图执行多个动画,您甚至可以对一个窗口执行一个动画,尽管类的名称和窗口不是 Cocoa 中的视图这一事实。

    您使用initWithViewAnimations:, which takes an array of dictionaries 创建视图动画。每个字典都标识目标 (NSViewAnimationTargetKey) 以及对它执行的操作:更改目标的框架(NSViewAnimationStartFrameKey 和 NSViewAnimationEndFrameKey)或淡入或淡出目标(NSViewAnimationEffectKey)。对于您的情况,您将更改目标的框架。

    当用户执行导致窗口大小调整的操作时,您需要计算所需的窗口整体大小(注意调整其框架的位置,使其不会超出屏幕),如以及视图的新框架(包括位置和大小)。所有将移动和/或改变大小的东西,为其创建一个字典并将其放入数组中。然后创建视图动画。

    NSViewAnimation 是NSAnimation 的一种,它提供了所有的方法来启动和停止动画,监控它的进度,hook 到它,以及将多个 NSAnimation 链接在一起。如果不出意外,您需要start the animation。

    【讨论】:

    • 您能否提供一个(简短的)代码示例?我以前从未使用过 NSDictionary,而且 Google 没有针对这个特定问题提供任何有效结果。使用实际代码理解起来会更容易和直观。
    • @FarhadYusufali:单个字典如下所示:@{ NSViewAnimationTargetKey: viewToMove, NSViewAnimationStartFrameKey: [viewToMove frame], NSViewAnimationEndFrameKey: newFrame }。您将把多个字典(每个视图一个)放入一个数组中,如下所示:@[ @{ … }, @{ … }, @{ … }, … ]
    【解决方案2】:

    如果您使用Interface Builder 来构建这些视图,那么我相信一种方法是设置“支柱和弹簧”。这些在“尺寸检查器”下可用,并且是“自动调整大小”标签上方的红色箭头和条形图。玩弄这些以获得您想要的效果,但总体思路是箭头控制视图大小如何调整以适应父视图大小的变化,而条形图控制视图边缘的关系随着大小的变化,到父视图的边缘。

    【讨论】:

    • 编程等效项是autoresizingMask。此外,Xcode 4.4(或者可能是 4.3)和更高版本中的 nib 默认使用基于约束的布局,因此如果您使用现代工具,则应改为编辑约束。
    • @PeterHosey 我将如何使用约束来实现这一点?
    • 谢谢,彼得。很好的补充。
    • @FarhadYusufali:是的,但仅限于基于非约束的 nib。这是一个二元选择;要么使用约束(4.4 及更高版本中的默认值),要么使用弹簧和支柱。
    • @ScottH 抱歉,我认为这无关紧要,但我需要在调整窗口大小后移动窗口的内容。这意味着上述方法将不起作用我在尝试上述方法后意识到这是相关的。再次抱歉浪费您的时间。
    【解决方案3】:

    在基于约束的布局中,将窗口边缘周围的视图设置为其父视图边缘的固定距离。

    Xcode 会从中推断出很多可调整性;如果仍然无法正确调整大小,请调整其约束,使其宽度和/或高度不再恒定。

    最简单的方法是移动视图,直到蓝线出现在编辑器中。每条蓝线对应于 HIG 中关于事物应该如何布置的规则,如果您将视图放在那里,Xcode 将创建与这些准则匹配的约束。例如,如果您将视图设置为距其父视图的右边缘 20 点,您将得到一条蓝线,如果您将视图放在那里,您将创建一个约束,即视图必须保持该距离那个边缘。

    superview 并不是唯一可以用来创建基于 HIG 的约束的视图。您还可以在同级视图之间创建准则约束。例如,如果您将一个按钮放在另一个按钮旁边的适当距离处,您将在该距离上看到一条蓝线,如果您放下它,您将创建一个约束,即这两个按钮必须与每个按钮保持该距离其他。

    如果你想做一些真正自定义的事情,笔尖编辑器右下角的三个按钮可以让你创建任何你想要的约束。您选择的内容决定了您可以创建哪些约束; nib 编辑器的大纲视图将帮助您确保拥有所需的选择。

    【讨论】:

    • 我认为约束不起作用。当窗口的大小改变时,我打算移动内容。添加约束将不允许我这样做。有其他选择吗?
    • @FarhadYusufali:是的:自己移动它们。查看 NSViewAnimation 和 animator 代理。
    • 您可以添加任何更改来解释我将如何做的详细信息吗?我查看了 NSViewAnimation 但不太了解。很抱歉之前没有提到这一点,浪费了您的时间。直到您提出解决方案后,我才意识到这是相关的。
    【解决方案4】:

    您将不得不遍历所有子视图并根据窗口框架的增量更改它们的框架位置。

    因此,如果您将窗口框架向所有方向扩展 20,则所有子视图都必须将其框架位置增加 (20,20) 以抵消窗口移动。

    【讨论】:

    • 或者把所有的变化都放到一个NSViewAnimation中,它会同时做所有的变化并且动画化。
    猜你喜欢
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    相关资源
    最近更新 更多