Xcode 5 自动布局 - 视图拉伸,但不是视图的内容



在Xcode 5 OSX中,而不是在ios中,我创建了一个视图并设置了自动布局约束,以便视图的侧面与框架保持固定距离。通过在运行时拖动窗口的角,视图可以正确拉伸,但视图的内容大小保持不变。内容由Bezier路径组成。收缩可以裁剪内容,而展开可以在不变的内容旁边提供大量的开放空间。

我还注意到,在"大小检查器"中更改"窗口"的彩色小窗口中的初始位置不会在运行时更改窗口在屏幕上的位置。它出现在上次运行时留下的相同位置。尺寸也保持不变。然后,它可以在屏幕上移动和调整大小,并将在下一次运行中显示在那里。

如何使内容随着视图和窗口而收缩或膨胀?

如何使窗口的大小检查器控制屏幕上的初始位置?

提前谢谢。

您可能在代码中绘制视图的内容。你可以选择做任何你想做的事。如果希望视图的纵横比以某种方式更改图形,请将该逻辑包含到代码中。

您也可以将视图的bounds矩形设置为不同于其frame矩形。一旦设置了边界,它们将不再自动与帧保持同步。因此,从边界到帧的转换将不再是一对一的映射。当您更改帧时,并且考虑到边界不会更改以跟踪它,映射将有效地缩放视图的内容。

界限应该是多少由你决定。例如,您可以将其设置为单位rect(原点为(0,0),大小为1x1)。显然,您需要考虑图形代码中的坐标系。

请参见《视图编程指南:视图几何图形》。

至于窗口大小:您已经为窗口设置了一个自动保存名称。这样做的全部目的是保存窗口位置,并在下次显示窗口时将其恢复。如果您不希望出现这种行为,请不要设置(即清除)窗口的自动保存名称。

@JeremyP:感谢您的指导。

以下是有效的方法。如果有趣的话,这个代码和我的评论可以在cocoa-dev@lists.apple.com,2014年9月29日下午8:35,使用Graham Cox的大纲介绍成功。把它全部包括在这里会很冗长,可能会引起混乱。

// scale the content to track the frame
{
NSBezierPath *path;
NSRect bounds;
CGFloat scaleX,scaleY;
}

   scaleX =NSWidth(bounds)/NSWidth([path bounds]);
   scaleY =NSHeight(bounds)/NSHeight([path bounds]);

   NSAffineTransform* tfm = [[NSAffineTransform alloc] init];
   [tfm scaleXBy:scaleX yBy:scaleY];
   NSBezierPath* temp  = [tfm transformBezierPath:path];
   //   [tfm concat];
   [temp stroke];

最新更新