改变Cocoa的窗口大小?

时间:2012-09-07 02:29:52

标签: objective-c macos cocoa user-interface

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

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

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

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

4 个答案:

答案 0 :(得分:2)

如果您使用Interface Builder来构建这些视图,那么我认为一种方法是设置“struts和spring”。这些在“尺寸检查器”下可用,并且是“自动调整”标签上方的红色箭头和条形。玩这些以获得您想要的效果,但一般的想法是箭头控制视图的大小如何调整父视图的大小的变化,并且条控制视图的边缘的关系当大小改变时,到父视图的边缘。

答案 1 :(得分:2)

  

Constraints和/或Springs和Struts不起作用,因为我需要在调整窗口大小后移动内容。

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

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

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

当用户执行导致窗口大小调整的事情时,您需要计算窗口所需的整体大小(注意调整其框架的位置,使其不会在屏幕上生长),如以及您的观点的新框架 - 位置和大小。将移动和/或改变大小的所有内容,为其创建字典并将其放入数组中。然后创建视图动画。

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

答案 2 :(得分:0)

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

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

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

superview不是唯一可以创建基于HIG的约束的视图。您还可以在兄弟视图之间创建指南约束。例如,如果您将一个按钮放在另一个按钮旁边的适当距离处,那么您将在该距离上获得一条蓝线,如果您放下它,您将创建一个约束,即这两个按钮必须与每个按钮保持距离。其他

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

答案 3 :(得分:0)

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

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