在应用程序窗口调整大小时调整NSView的大小

时间:2014-06-11 17:08:18

标签: cocoa

我一直在努力解决这个问题。

我有一个具有自定义视图的应用程序。应用程序启动时,我将自定义视图的帧大小设置为应用程序窗口的帧大小。这有效。在AppDelegate.m中,我将另一个视图控制器的视图加载到自定义视图中。在视图控制器的视图中,我有一个以编程方式放置在屏幕中心的图像。我的AppDelegate.m中有一个windowDidResize方法,当我调整应用程序窗口的大小时会调用它。

问题是当我调整应用程序窗口的大小时,图像不会重新定位在主窗口的中心。我尝试在加载的视图和视图控制器上使用NSWindowDelegate,并编写一个windowDidResize:方法,但这也不起作用。

请帮忙! 感谢。

1 个答案:

答案 0 :(得分:0)

可能是一个黑客攻击,但我所做的是捕获初始窗口框架等大小作为一个初始窗口的#iv;方法;然后我用它来缩放在运行时测量的任何x / y /高度/宽度。

//  Handy scaling macros
#define X(xVal)         ((xVal) * (x_scale))
#define Y(yVal)         ((yVal) * (y_scale))

每个窗口的代理处理程序用于更改大小:

- (void)set_scales:(NSSize)size
{
    self.x_scale = (CGFloat)(size.width)  / (CGFloat)(orig.width);
    self.y_scale = (CGFloat)(size.height) / (CGFloat)(orig.height);
}

并且这些窗口的def / undef为x / y_scale宏只会返回这些ivars。总而言之,每个窗口都有一个NSSize orig,CGFloat x,y,一个缩放委托方法,两个宏(x / y_scale)和两个全局宏X,Y。

然后每当绘图等时,使用X()和Y()宏来定位和影响h / w。即,

[@"foo" drawAtPoint:NSMakePoint(X(100),Y(200)) withAttributes:nil];