如何为NSView绘制虚线边框

时间:2016-04-13 11:09:34

标签: objective-c

在我的自定义视图中,我的代码如下:

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];

     //Drawing code here.
    [self setWantsLayer: YES];
    [self.layer setBorderWidth: 1];

    [self.layer setBorderColor:[NSColor colorWithRed:205/255.0 green:211/255.0 blue:232/255.0 alpha:1.0].CGColor];
    [self.layer setCornerRadius: 10];
}

可以为我的NSView设置边框线和颜色,但是我想设置一个虚线,有人知道怎么做吗? 我尝试了网络搜索中的一些代码,但它根本没有绘制边框。

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];

    // Drawing code here.
    CGFloat dashPattern[] = {10,4}; //make your pattern here
    NSBezierPath *textViewSurround = [NSBezierPath bezierPathWithRoundedRect:self.frame xRadius:10 yRadius:10];
    [textViewSurround setLineWidth:2.0f];
    [textViewSurround setLineDash:dashPattern count:2 phase:0];
    [[NSColor colorWithRed:205/255.0 green:211/255.0 blue:232/255.0 alpha:1.0] set];
    [textViewSurround stroke];
}

4 个答案:

答案 0 :(得分:6)

这是一个在Swift 3中使用NSView子类的完整示例:

attr("data-uk-scrollspy-nav","its value")

答案 1 :(得分:0)

你可以通过 CGContext 来做到这一点这是一个对我有用的答案:

how to make dashed line moveable

我的结果:

enter image description here

答案 2 :(得分:0)

如果您想使用CAShapeLayer(Swift 4.2)设置线边框:

class StrokeWithDashedLineView: NSView {

   private let shapeLayer = CAShapeLayer()
   private let fillLayer = CALayer()
   private let textLabel = NSTextField().autolayoutView()

   override init(frame frameRect: NSRect) {
      super.init(frame: frameRect)
      setupUI()
      setupLayout()
   }

   required init?(coder decoder: NSCoder) {
      fatalError()
   }

   override var intrinsicContentSize: NSSize {
      return CGSize(intrinsicHeight: 76)
   }

   override func layout() {
      super.layout()
      updateLayers()
   }

   private func updateLayers() {
      layer?.cornerRadius = 0.5 * bounds.height // Making ourselves rounded.

      // Stroke Layer
      let shapeBounds = CGRect(width: bounds.width - shapeLayer.lineWidth, height: bounds.height - shapeLayer.lineWidth)
      let shapeRadius = 0.5 * shapeBounds.height
      let path = CGMutablePath()
      path.addRoundedRect(in: shapeBounds, cornerWidth: shapeRadius, cornerHeight: shapeRadius)
      shapeLayer.path = path
      shapeLayer.bounds = shapeBounds
      shapeLayer.position = CGPoint(x: 0.5 * shapeLayer.lineWidth, y: 0.5 * shapeLayer.lineWidth)

      // Fill Layer
      let fillBounds = CGRect(width: bounds.width - 2 * shapeLayer.lineWidth, height: bounds.height - 2 * shapeLayer.lineWidth)
      fillLayer.cornerRadius = 0.5 * fillBounds.height
      fillLayer.bounds = fillBounds
      fillLayer.position = CGPoint(x: shapeLayer.lineWidth, y: shapeLayer.lineWidth)
   }

   private func setupUI() {
      wantsLayer = true
      layer?.masksToBounds = true

      shapeLayer.lineWidth = 3
      shapeLayer.strokeColor = NSColor.red.cgColor
      shapeLayer.fillColor = nil
      shapeLayer.lineDashPattern = [11.2, 11.2]
      shapeLayer.lineCap = .round
      shapeLayer.anchorPoint = .zero

      fillLayer.backgroundColor = NSColor.yellow.cgColor
      fillLayer.anchorPoint = .zero

      layer?.addSublayer(shapeLayer)
      layer?.addSublayer(fillLayer)

      addSubview(textLabel)

      textLabel.text = "Drag Xib or Storyboard files onto\nthis window to open them"
      textLabel.alignment = .center
      textLabel.textColor = .black
      textLabel.font = NSFont.semibold(size: 13)
      textLabel.isEditable = false
      textLabel.drawsBackground = false
      textLabel.isBezeled = false
   }

   private func setupLayout() {
      textLabel.centerXAnchor.constraint(equalTo: centerXAnchor).activate()
      textLabel.centerYAnchor.constraint(equalTo: centerYAnchor).activate()
   }
}

结果:

Window with CAShapeLayer

答案 3 :(得分:-1)

你可以这样做,

[yourView.layer setBorderWidth:5.0];
[yourView.layer setBorderColor:[[UIColor colorWithPatternImage:[UIImage imageNamed:@"DotedImage.png"]] CGColor]];

在项目中添加虚线图像并导入项目中的QuartzCore/QuartzCore.h

#import <QuartzCore/QuartzCore.h>

更新:

图像尺寸和视图尺寸应相同。