我有一个包含子视图的自定义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;
}
答案 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]
代替dirtyRect
。 dirtyRect
是一个描述需要重绘的区域的矩形。这并不总是您视图的整个边界矩形。另一方面,[self bounds]
将始终代表视图的整个边界,无论重绘哪个部分。