【问题标题】:Using a patternimage for a View inside an NSScrollView为 NSScrollView 中的视图使用模式图像
【发布时间】:2011-12-13 16:10:32
【问题描述】:

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

结果应该是这样的:

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

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

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

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

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

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];

应该可以吧? 然而,内容视图在滚动时被剪裁并看起来像这样:

我试过这个来修复它,但它什么也没做:

[[projectsListView documentView] setCopiesOnScroll:NO];

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

[[projectsListView contentView] setCopiesOnScroll:NO];

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

我真的很想使用 patternimage 方法,因为我不知道列表会有多长。这取决于用户。

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

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

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 正如我所说,我确实尝试过 setCopiedOnScroll。但是它并没有按预期工作。
    【解决方案2】:

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

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

    感谢 Rob Keniger 的回答。我可能会尝试一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多