NSView Scale适合自己和子视图

时间:2014-07-31 03:20:02

标签: objective-c macos cocoa nsview nswindow

我有NSView(父),可以有任意数量的孩子NSView' s。用户使用按钮添加新视图,例如添加图像/背景视图等。一般来说,父视图nsview可以有任何大小,假设1200x1800,子视图也可以有任何大小,例如每个600x900(让我们假设我有4个子视图,位于以下位置。这些视图覆盖整个父视图。父视图也不是主窗口的直接内容视图。

child view 1 (0,0,600,900)
child view 2 (601,0,600,900)
child view 3 (0,901,600,900)
child view 4 (601,901,600,900)

应用程序的功能是它可以保存父级的所有位置/属性以及xml中的子视图,以后可以导入。

问题:现在,当处理像MacBook 13和#34;这样的小屏幕时,1200x1800尺寸溢出,并且需要滚动或缩放以适应功能。我不想要滚动功能,但需要一种方法,当我加载1200x1800大小的父视图时,它会自动适应可用屏幕,保持它的宽高比。

由于子视图信息也已保存,可以从xml加载,因此我需要相同的功能。我使用" addSubview"添加所有子视图特征。

我认为一种解决方案是相对于窗口的当前宽度/高度相对改变(使用宽度和高度比)所有视图的位置坐标,并且它的工作类型但是有时间来回转换坐标松散1到2个像素(数学轮和细胞问题)。

我也在父视图的drawRect中尝试过NSAffineTransform,但是没有用。下面是代码,即使它适用于父级的子视图呢?

- (void) drawRect: (NSRect) dirtyRect {
//Just for testing using hardcoded values
    [[NSGraphicsContext currentContext] saveGraphicsState];
    NSAffineTransform *transform = [[NSAffineTransform alloc] init];
    [transform translateXBy:100 yBy:100];
    [transform scaleBy:-2.0];
    [transform set];
    [[NSGraphicsContext currentContext] restoreGraphicsState];
}

自动调整大小也不起作用。

所以我只希望所有视图都适合当前可用空间并保持其位置。过去一周我一直在努力解决这个问题,但没有解决方案。有什么我错过或做错了。我认为必须有一些好的方法来处理它,但无法弄明白。

请帮忙。

1 个答案:

答案 0 :(得分:0)

经过大量研究后,我使用[myview scaleUnitSquareToSize:mysize];

找到了解决方案

效果很好。