在NSScrollView中为View使用patternimage

时间:2011-12-13 16:10:32

标签: objective-c cocoa background-image clipping nsscrollview

我有一个很大的问题,我真的无法解决自己。

结果应如下所示:

enter image description here

这张图片是用photoshop制作的,是我尝试构建的界面的一部分。

在中间你会看到一些东西,应该是一个项目列表,你应该能够滚动,如果它的列表比视图大。

所以我正在制作这样的滚动视图:(由于某种原因,我无法在界面构建器中执行此操作并希望以编程方式工作)

NSScrollView *projectsListView = [[NSScrollView alloc] initWithFrame:NSMakeRect(15, 2, 801, 588)];
[projectsListView setHasVerticalScroller:YES];

然后我创建内容视图并将图案图像设置为backgroundcolor:

NSClipView  *contentView      = [[NSClipView  alloc] initWithFrame:NSMakeRect(0, 0, 
[projectsListView frame].size.width, [projectsListView frame].size.height+(98*2))];
[contentView setBackgroundColor:[NSColor colorWithPatternImage:[NSImage imageNamed:@"BoxLineBackground"]]];
[contentView setDrawsBackground:YES];

然后将视图设置为文档视图:

[projectsListView setDocumentView:contentView];

应该工作吧? 但是,内容视图会被剪裁,滚动时看起来像这样:

enter image description here

我试过这个来修复它,但它没有做任何事情:

[[projectsListView documentView] setCopiesOnScroll:NO];

我也尝试了这个,但它导致内容视图根本不滚动。 图像保持不变,但我可以正常移动滚动条。

[[projectsListView contentView] setCopiesOnScroll:NO];

如果我尝试使用setContentView设置contentview:而不是使用setDocumentView: 它可能会工作,但滚动条消失了,所以它也无法正常工作。

我真的很想使用patternimage方法,因为我无法判断列表的长度。这取决于用户。

然后另一个问题是将整个事情四舍五入,但这并不重要。我尝试使用透明边框图像并使用NSImageView将NSScrollView与它叠加在一起,但这又会导致损坏,因为它会剪切并移动图像视图的重叠部分以及滚动视图的内容。

任何有想法的人,如何实现这个目标?

由于

2 个答案:

答案 0 :(得分:1)

这个界面应该使用基于视图的NSTableView来实现,而不是重新发明轮子。然后可以在Interface Builder中创建表格单元UI,您可以使用各种NSTableView委托方法控制单元格的背景。 NSTableView会在正确滚动时处理重绘。

要处理图案颜色,只需将单元格的背景设为NSTableCellView的自定义子类,然后实现图案绘制代码。

无论如何,您遇到的问题是由NSScrollView绘图优化引起的。您可以通过调用[[yourScrollView contentView] setCopiesOnScroll:NO]实例上的NSScrollView来关闭此功能。您也可以在Interface Builder中进行设置,只需取消选中滚动时复制复选框。

答案 1 :(得分:0)

我通过在NSScrollView上设置背景颜色而不是NSClipView来解决问题。

我虽然在这种情况下背景会是静态的,但我需要为内容视图设置它,但是它工作得很好,并且与内容视图一起滚动。

感谢Rob Keniger的回答。我可能会试试这个。