1

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

我将我的 InitFrameWith 修改为:

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

    return self;
}

当我第一次启动我的新应用并请求 [self bounds] 时,我得到了正确的值:{{0, 50}, {600, 450}}。然后我通过用鼠标拖动来更改窗口的大小。重新启动我的应用时,initWithFrame 返回相同的值:{{0, 50}, {600, 450}}。

但我新改变了大小。我已经尝试了几件事,但没有成功。

任何线索我做错了什么?

谢谢,罗纳德

4

1 回答 1

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 中,如果矩形发生了变化,我调用我的 layoutViews 方法:

- (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 具有自定义布局逻辑。

希望有帮助。

于 2012-10-11T03:59:45.800 回答