NSView Self的实际大小

时间:2012-10-11 03:45:28

标签: objective-c nsview self bounds

我刚开始一个全新的项目GrafLaboratory,在NSView中进行绘图实验。 我在主窗口中添加了一个自定义视图,并将其配置为在窗口改变大小时采用它的大小。

我将我的InitFrameWith修改为:

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        NSRect r = [self bounds];
    }

    return self;
}

当我第一次启动新应用并询问[自我限制]时,我得到了正确的值:{{0,50},{600,450}}。然后我用鼠标拖动来改变窗口的大小。重新启动我的应用程序时,initWithFrame返回相同的值:{{0,50},{600,450}}。

但我改变了尺寸。我已经尝试了几件事但没有成功。

有什么线索我做错了吗?

谢谢,罗纳德

1 个答案:

答案 0 :(得分:2)

initWithFrame仅在初始化帧内的对象时才相关。

如果是带有自定义绘图的自定义UIView,请查看:

- (void)drawRect:(NSRect)frame

当调用setNeedsDisplay和/或调整视图大小时,将调用它。

使用一些自定义视图,我在initWithFrame中做的一件事是设置自动调整大小的掩码:

    // subviews autoresize
    [self setAutoresizesSubviews:YES];   
    // set resize masks (springs)
    [self setAutoresizingMask:(NSViewMaxXMargin | NSViewMinXMargin |
                              NSViewMaxYMargin | NSViewMinYMargin |
                              NSViewHeightSizable | NSViewWidthSizable)];

然后在init和drawRect中,如果rect已经改变,我会调用layoutViews metod:

- (void)drawRect:(NSRect)frame {
    ...
    // called on resize.  on init, delegate isn't hooked up so we'll skip
    if (!NSEqualRects(_prevRect, [self bounds]))
    {
        [self layoutViews];
    }

    // stash away rect for comparison so layout view code only happens when the rect changes
    _prevRect = [self bounds];

我的layoutViews有自定义布局逻辑。

希望有所帮助。