自定义NSView的子视图正在调整自身以适应其超级视图

时间:2010-03-22 17:52:43

标签: objective-c cocoa nsview

我有一个包含子视图的自定义NSView - 为了解决这个问题,顶级视图只是充当容器并自动调整大小以适应窗口。它的子视图从窗口边缘绘制一个10像素的矩形,除了底部,它应该被窗口剪切,直到它被调整大小以显示整个矩形。然而,它并不像我想的那样表现,而是当它的超视图的高度小于它时,缩小矩形的高度。如何避免这种情况并使其保持在适当的高度,而在超级视图较小时会被剪裁?

父视图的实现代码是:

- (id)initWithFrame:(NSRect)frameRect {
    self = [super initWithFrame:frameRect];
    if (self) {
        subView = [[SubView alloc] initWithFrame:frameRect];
    }
    return self;
}

- (void)drawRect:(NSRect)dirtyRect {
    [[NSColor grayColor] set];
    [subView setFrame:NSMakeRect(10, 10, dirtyRect.size.width - 20, 500)];
    [self addSubview:subView];
}

- (BOOL)isFlipped {
    return YES;
}

子视图只是:

- (void)drawRect:(NSRect)dirtyRect {
    [[NSColor blackColor] set];
    [NSBezierPath strokeRect:dirtyRect];
}

- (BOOL)isFlipped {
    return YES;
}

2 个答案:

答案 0 :(得分:2)

您的子视图很可能具有自动调整遮罩。您可以通过调用-setAutoresizingMask:with NSViewNotSizable来清除它。

如果超级视图不应调整任何子视图的大小,您可以考虑使用-setAutoresizesSubviews:

答案 1 :(得分:2)

正如ericgorr所指出的,autoResizingMask应该处理调整大小问题。

但是,我注意到您要在drawRect中添加子视图,而这不是正确的地方。 drawRect在程序的生命周期中被多次调用,但addSubview:只需要调用一次(并且只应 ),如下所示:

- (id)initWithFrame:(NSRect)frameRect {
    self = [super initWithFrame:frameRect];
    if (self) {
        subView = [[SubView alloc] initWithFrame:frameRect];
        [self addSubview:subView]; // this view now owns subView ...
        [subView release];         // ... so we can release our copy
    }
    return self; 
} 

- (void)drawRect:(NSRect)dirtyRect { 
    [[NSColor grayColor] set]; 
    [subView setFrame:NSMakeRect(10, 10, [self bounds].size.width - 20, 500)];
} 

另请注意使用[self bounds]代替dirtyRectdirtyRect是一个描述需要重绘的区域的矩形。这并不总是您视图的整个边界矩形。另一方面,[self bounds]将始终代表视图的整个边界,无论重绘哪个部分。