添加内容后,NSScrollView不显示垂直滚动条

时间:2010-01-04 20:56:36

标签: objective-c cocoa macos user-interface

我创建了一个NSScrollView,它本身包含一个NSClippedView作为内容视图(这是默认的,由IB创建)。在内容视图中,有(默认)文档视图。

此NSScrollView已禁用水平滚动并启用垂直,最重要的是启用了自动隐藏滚动条。

当我将新视图(通过代码,运行时)添加到文档视图时,滚动器不会自动取消隐藏,直到我垂直调整窗口大小(然后调整滚动视图的大小)。 1px就足够了。只是窗口的新画面似乎已经足够了。

我正在寻找的是通过代码触发:所以当我向scrollviews的内容视图添加视图时,我希望滚动条出现。

int numberOfChildViews = 10; //hard coded for example here
int childViewHeight = 80; //same as above

NSRect rect = NSMakeRect(0, 0, [[self.scrollView contentView] bounds].size.width, [numberOfChildViews*childViewHeight);
[[self.scrollView documentView] setFrame:rect];
[[self.scrollView documentView] setBounds:rect]; //just added to make sure

然后我将自定义视图添加到文档视图中,例如:

for (int i=0; i<numberOfChildViews; i++) {
    NZBProgressViewController *item = [nzbProgressArray objectAtIndex:i];

    int y=i*[[item view] bounds].size.height;
    rect= NSMakeRect(0, y, [[scrollView contentView] frame].size.width, [[item view] bounds].size.height);

            [[item view] setFrame:rect];
    currentPosition++;
}

我正在使用FlippedView,因此原点将显示在左上角,如下所示:

@interface NSFlippedClipView : NSClipView {
}

@implementation NSFlippedClipView
- (BOOL)isFlipped {
    return YES;
}

- (BOOL)isOpaque {
    return YES;
}
@end

并将以下代码添加到awakeFromNib

NSFlippedClipView *documentView = [[NSFlippedClipView alloc] init];
[documentView setAutoresizingMask:NSViewWidthSizable];
[documentView setBackgroundColor:[self.scrollView backgroundColor]];

[self.scrollView setDocumentView:documentView];
[documentView release];

2 个答案:

答案 0 :(得分:1)

只要文档视图的大小调整为大于滚动视图的当前视口,滚动条就会变为可见。您是否在向其添加子视图时调整文档视图的大小?

答案 1 :(得分:1)

啊,这是我自己的坏事。供将来参考:如果要将原点(0,0)移动到左上角,请使用NSView而不是NSClippedView扩展类,并将IsFlipped方法覆盖为YES。

感谢irsk的回答。