2010-03-22 79 views
1

我有一个自定义NSView,其中包含一个子视图 - 为了解决这个问题,顶级视图只是充当一个容器,并自动调整大小以适应窗口。它的子视图从窗口边缘绘制一个10像素的插入矩形,除了底部,它应该被窗口剪切,直到它被调整大小以显示整个矩形。但是,它并不像我打算的那样工作,而是在其超视图的高度比它小的时候缩小矩形的高度。我该如何避免这种情况,并让它保持在适当的高度,而在超视图较小时才剪辑?自定义NSView的子视图正在调整自己的大小,以适应其超级视图

父视图的实现代码:

- (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

由于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]将始终代表视图的整个边界,而不管哪个部分正在重绘。

+0

正如我在回答ericgorr的回答时指出的那样,我无法使用autoResizingMask工作。关于'addSubview:'的位置和使用'[自定义]',但是,谢谢你让我知道!这就说得通了。 – 2010-03-22 20:32:24

+0

现在我已经在subview中使用'[self bounds]'而不是'dirtyRect',它可以工作,这对您描述要重绘的区域的'dirtyRect'的解释是有意义的。那谢谢啦! – 2010-03-22 20:37:18

+0

不客气!很高兴听到它的工作。 – 2010-03-22 20:45:15

2

最有可能你的子视图具有自动尺寸调整掩码。你可以通过调用-setAutoresizingMask来清除它:使用NSViewNotSizable。

如果上海华不应该调整任何它的子视图,你可以考虑使用-setAutoresizesSubviews:

+0

我有,唉,同时尝试两个superview和子视图-setAutoresizesMask:NSViewNotSizeable,和超级视图-setAutoresizesSubviews,无济于事。它与我尝试过的所有组合的行为方式相同。 – 2010-03-22 20:29:08

相关问题