【问题标题】:Rounded rect on NSView that clips all containing subviewsNSView 上的圆角矩形剪辑所有包含子视图
【发布时间】:2011-07-02 12:47:52
【问题描述】:

我正在创建一个带有圆角的NSView 子类。这个视图是一个容器,其他子视图将被添加到其中。我试图让NSView 的圆角也剪裁所有子视图的角,但我无法得到它。

- (void)drawRect:(NSRect)dirtyRect {
    NSRect rect = [self bounds];
    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:self.radius yRadius:self.radius];
    [path addClip];

    [[NSColor redColor] set];
    NSRectFill(dirtyRect);

    [super drawRect:dirtyRect];     
}

红色只是举例。如果我向矩形添加子视图,则不会剪裁角:

我怎样才能做到这一点?

【问题讨论】:

  • -drawRect 中的剪辑:只影响视图的绘制,与视图整个矩形中仍然存在的子视图无关。绘图不是子视图上,而是在子视图之下。杰森的回答是关于实现这一目标的唯一方法。使用图层支持的视图。

标签: cocoa nsview rounded-corners clipping nsbezierpath


【解决方案1】:

你试过用图层剪裁吗?

self.layer.cornerRadius = self.radius; self.layer.masksToBounds = YES;


啊,抱歉,不知何故我错过了你在谈论 NSView,而不是 UIView。在所有情况下都很难剪辑 NSView 子视图,因为似乎大多数 Cocoa 标准视图都设置了自己的剪辑路径。使用一些填充来布局子视图可能会更容易,并且不需要剪辑。

【讨论】:

  • 是的。添加这些行以及 [self setWantsLayer:YES] 不会使容器或其内容的角变圆
  • 啊,抱歉,不知何故我错过了你在谈论 NSView,而不是 UIView。在所有情况下都很难剪辑 NSView 子视图,因为似乎大多数 Cocoa 标准视图都设置了自己的剪辑路径。使用一些填充来布局子视图可能会更容易,并且不需要剪辑。
  • 我重新考虑了我的布局。标记为正确,但您应该编辑您的答案以包含您在评论中所说的内容,而不是不正确的图层内容以避免混淆
  • 所以想赞成这个答案,因为它对我的 UIView 有帮助。
【解决方案2】:

使用核心动画层将正确地剪辑子层。

在您的容器 NSView 子类中:

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.layer = _layer;   // strangely necessary
        self.wantsLayer = YES;
        self.layer.masksToBounds = YES;    
        self.layer.cornerRadius = 10.0;    
    }    
    return self;
}

【讨论】:

  • 注意:这不适用于圆角 NSScrollView 的角的特殊情况,其文档视图的大小增长超过 NSScrollView 的边界(它似乎会在文档重置图层剪切路径边界变化)。但是,如果文档视图的静态大小小于或等于滚动视图大小,它将起作用。
  • 调用之前 self.wantsLayer = YES;你需要设置层:self.layer = layer; developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
  • @JasonFuerstenberg self.wantsLayer = YES; 将自动创建一个CALayer 并将其分配给视图layer 属性。真的没有理由这样做。
【解决方案3】:

您可以在界面构建器中做到这一点无需子类化添加用户定义的运行时属性”

【讨论】:

  • 请注意,这仅在您在 View Effects 检查器中启用 CALayer 时有效;它的设置似乎覆盖了自定义属性。
  • 惊人的解决方案。我不知道我们能做到这一点。谢谢。
猜你喜欢
  • 2010-11-22
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
相关资源
最近更新 更多