如何让NSScrollView尊重剪切路径

时间:2011-03-11 02:54:15

标签: cocoa subclass rounded-corners nsscrollview nsbezierpath

我正在尝试使用剪切角创建一个NSScrollView,类似于Twitter应用程序:

enter image description here

我有一个NSScrollView子类,我添加了以下代码:

- (void)drawRect:(NSRect)dirtyRect {
    NSBezierPath *pcath = [NSBezierPath bezierPathWithRoundedRect:[self bounds] xRadius:kDefaultCornerRadius yRadius:kDefaultCornerRadius];
    [path setClip];

    [super drawRect:dirtyRect];
}

我希望NSScrollView的内容有圆角,但它不符合剪切路径。我怎样才能做到这一点?




更新&澄清
我知道如何制作自定义NSScroller,我知道如何使其成为透明叠加层。我要问的是如何使NSSCrollView剪辑角落,包括它包含的所有内容。 NSScrollView位于NSView内,其背景可能会发生变化,这意味着视图叠加以假装圆角不是一种选择。

3 个答案:

答案 0 :(得分:6)

经过多次摆弄后,我发现NSScrollView可以通过简单地给它一个背衬层并设置该层的角半径提供来制作圆角,你也可以与内部NSClipView相同。两者都是必需的,现在有意义,因为它是剪辑视图,它实际上为NSScrollView的文档视图提供了可视窗口。

NSScrollView * scrollView = ...;

// Give the NSScrollView a backing layer and set it's corner radius.
[scrollView setWantsLayer:YES];
[scrollView.layer setCornerRadius:10.0f];

// Give the NSScrollView's internal clip view a backing layer and set it's corner radius.
[scrollView.contentView setWantsLayer:YES];
[scrollView.contentView.layer setCornerRadius:10.0f];

答案 1 :(得分:4)

您可以将遮罩应用于视图的图层:

[myScrollView setWantsLayer: YES];
[myScrollView layer].mask = ...;

面具是另一个CALayer。因此,在这种情况下,您需要创建CALayer,将其背景颜色设置为不透明,设置其边界以匹配滚动视图,并为其指定cornerRadius,例如8.0

结果是滚动视图及其所有内容看起来被掩盖为圆角,半径为8px。

答案 2 :(得分:3)

你有没有试过覆盖

- (BOOL)isOpaque {
  return NO;
}

将滚动视图的-setDrawsBackground:设置为NO并保持视图不会剪裁,只需使用[NSColor clearColor]绘制角落,因为这样也会清除底层颜色并模拟圆形效果