圆角和描边的NSImageView

6
我创建了NSImageView的子类,并希望在其周围绘制带有圆角的边框。虽然代码能够实现该功能,但我需要将图像的角剪裁掉。
请查看我的截图: enter image description here 我已经编写了以下代码来绘制边框/角落:
- (void)drawRect:(NSRect)dirtyRect
{
    [super drawRect:dirtyRect];

    NSColor *strokeColor;
    if(self.isSelected)
        strokeColor = [NSColor colorFromHexRGB:@"f9eca2"];
    else
        strokeColor = [NSColor colorFromHexRGB:@"000000"];

    [strokeColor set];    
    [[NSBezierPath bezierPathWithRoundedRect:NSInsetRect(dirtyRect, 1, 1) xRadius:5 yRadius:5] stroke];
}

我该怎么做才能裁剪图片?

编辑:

好了,我已经解决了,但我觉得这种方法很丑陋。有更聪明的方法吗?

新代码:

- (void)drawRect:(NSRect)dirtyRect
{
    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:NSInsetRect(dirtyRect, 2, 2) xRadius:5 yRadius:5];

    [path setLineWidth:4.0];
    [path addClip];

    [self.image drawAtPoint: NSZeroPoint
                 fromRect:dirtyRect
                 operation:NSCompositeSourceOver
                 fraction: 1.0];

    [super drawRect:dirtyRect];

    NSColor *strokeColor;
    if(self.isSelected)
    {
        strokeColor = [NSColor colorFromHexRGB:@"f9eca2"];
    }
    else
        strokeColor = [NSColor colorFromHexRGB:@"000000"];

    [strokeColor set];    
    [NSBezierPath setDefaultLineWidth:4.0];
    [[NSBezierPath bezierPathWithRoundedRect:NSInsetRect(dirtyRect, 2, 2) xRadius:5 yRadius:5] stroke];
}
2个回答

4

将您的NSImageView图层的圆角半径设置为5像素,并将其maskToBounds属性设置为YES


3
NSImageView没有clipsToBounds属性 - 它是NS ImageView而不是UI ImageView。 - SteveF
18
为什么 StackOverflow 上每秒钟都有一个人认为 Objective-C 代码等同于 iOS? - strange
3
如果你仔细阅读答案,就会发现他在谈论图像视图的层,即使在AppKit中它也有一个clipToBounds属性。编辑:不要忘记通过使用-[NSView setWantsLayer:YES]来启用图层。 - dvkch
除了NSImageView及其CALayer之外,它们都没有clipToBounds属性。因此,这个答案在所有方面都是错误的。 - Claus Jørgensen
但它有一个maskToBounds属性可以完成这项工作。 - yinkou

2

针对XCode 8.3和Swift 3.1的更新答案如下:

import Cocoa

class SomeViewController: NSViewController {
  @IBOutlet weak var artwork: NSImageView!

  override func viewDidLoad() {
    super.viewDidLoad()
    artwork.wantsLayer = true // Use a layer as backing store for this view
    artwork.canDrawSubviewsIntoLayer = true // Important, flatten all subviews into layer
    artwork.layer?.cornerRadius = 4.0
    artwork.layer?.masksToBounds = true // Mask layer
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接