drawing dashed line using CALayer

后端 未结 8 1358
执笔经年
执笔经年 2020-12-04 16:49

I was able to draw a dashed box, using the following code:

CAShapeLayer *shapeLayer = [CAShapeLayer layer];
CGRect shapeRect = CGRectMake(0.0f, 0.0f, 200.0f,         


        
相关标签:
8条回答
  • 2020-12-04 17:22

    Below is the code snippet to draw a Dashed line in UIView (Xamarin iOS)

    Note: separatorView is my UIView which i need to show as Dashed

     public void ShowDottedLine()
     {
          var dashedLayer = new CAShapeLayer();
          var frameSize = separatorView.Frame.Size;
          var shapeRect = new CGRect(0, 0, frameSize.Width, frameSize.Height);
          dashedLayer.Bounds = shapeRect;
          dashedLayer.Position = new CGPoint(frameSize.Width / 2, frameSize.Height / 2);
          dashedLayer.FillColor = UIColor.Clear.CGColor;
          dashedLayer.StrokeColor = ColorUtils.ColorWithHex(ColorConstants.DarkBlue).CGColor;
          dashedLayer.LineWidth = 2;
          dashedLayer.LineJoin = CAShapeLayer.JoinRound;
          NSNumber[] patternArray = {5,5};
          dashedLayer.LineDashPattern = Array;
          var path = new CGPath();
          path.MoveToPoint(CGPoint.Empty);
          path.AddLineToPoint(new CGPoint(frameSize.Width, 0));
          dashedLayer.Path = path;
          separatorView.Layer.AddSublayer(dashedLayer);
     }
    
    0 讨论(0)
  • 2020-12-04 17:30

    Swift 2.2

    dropping this in here to save others time..

    extension UIView {
        func addDashedLine(color: UIColor = UIColor.lightGrayColor()) {
            layer.sublayers?.filter({ $0.name == "DashedTopLine" }).map({ $0.removeFromSuperlayer() })
            self.backgroundColor = UIColor.clearColor()
            let cgColor = color.CGColor
    
            let shapeLayer: CAShapeLayer = CAShapeLayer()
            let frameSize = self.frame.size
            let shapeRect = CGRect(x: 0, y: 0, width: frameSize.width, height: frameSize.height)
    
            shapeLayer.name = "DashedTopLine"
            shapeLayer.bounds = shapeRect
            shapeLayer.position = CGPoint(x: frameSize.width / 2, y: frameSize.height / 2)
            shapeLayer.fillColor = UIColor.clearColor().CGColor
            shapeLayer.strokeColor = cgColor
            shapeLayer.lineWidth = 1
            shapeLayer.lineJoin = kCALineJoinRound
            shapeLayer.lineDashPattern = [4, 4]
    
            let path: CGMutablePathRef = CGPathCreateMutable()
            CGPathMoveToPoint(path, nil, 0, 0)
            CGPathAddLineToPoint(path, nil, self.frame.width, 0)
            shapeLayer.path = path
    
            self.layer.addSublayer(shapeLayer)
        }
    }
    
    0 讨论(0)
  • 2020-12-04 17:39

    See:

    https://developer.apple.com/library/mac/documentation/graphicsimaging/Reference/CGContext/Reference/reference.html#//apple_ref/c/func/CGContextSetLineDash

    CGFloat dashLengths[] = { 10, 5 };
    CGContextSetLineDash(context, 0, dashLengths, 2);
    
    0 讨论(0)
  • 2020-12-04 17:43

    Got it working in Objective C with the simplified code as below

       //Dashed line for road
        CAShapeLayer *dashedLine = [CAShapeLayer layer];
        [dashedLine setFrame:CGRectMake(0, 342, 100 , 100)];
    
        // Setup the path
        CGMutablePathRef thePath = CGPathCreateMutable();
        CGPathMoveToPoint(thePath, NULL, 0, 10);
        CGPathAddLineToPoint(thePath, NULL, screenSize.width,10);
        dashedLine.path = thePath;
        CGPathRelease(thePath);
    
        [dashedLine setLineDashPattern: [NSArray arrayWithObjects:[NSNumber numberWithFloat:15], nil]];
        dashedLine.lineWidth = 1.0f;
        dashedLine.strokeColor =  [[UIColor redcolor] CGColor]];
    
        [self.view.layer addSublayer:dashedLine];
    
    0 讨论(0)
  • 2020-12-04 17:44

    Lines are drawn by first moving the path to a starting point of the line, then adding a line segment to a point:

    CGContextBeginPath(context);
    CGContextMoveToPoint(context, 10.5f, 10.5f);
    CGContextAddLineToPoint(context, 20.5f, 20.5f);
    CGContextClosePath(context);
    CGContextDrawPath(context, kCGPathFillStroke);
    

    For drawing dashed line, You need to use CAShapeLayer

    CAShapeLayer *shapeLayer = [CAShapeLayer layer];
    [shapeLayer setBounds:self.bounds];
    [shapeLayer setPosition:self.center];
    [shapeLayer setFillColor:[[UIColor clearColor] CGColor]];
    [shapeLayer setStrokeColor:[[UIColor blackColor] CGColor]];
    [shapeLayer setLineWidth:3.0f];
    [shapeLayer setLineJoin:kCALineJoinRound];
    [shapeLayer setLineDashPattern:
     [NSArray arrayWithObjects:[NSNumber numberWithInt:10],
      [NSNumber numberWithInt:5],nil]];
    
    // Setup the path
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, 10, 10);
    CGPathAddLineToPoint(path, NULL, 100,100);
    
    [shapeLayer setPath:path];
    CGPathRelease(path);
    
    [[self layer] addSublayer:shapeLayer];
    
    0 讨论(0)
  • 2020-12-04 17:45

    Try this code, it works for me,

    Swift 3.0

    extension UIView {
        func addDashedLine(strokeColor: UIColor, lineWidth: CGFloat) {
    
            backgroundColor = .clear
    
            let shapeLayer = CAShapeLayer()
            shapeLayer.name = "DashedTopLine"
            shapeLayer.bounds = bounds
            shapeLayer.position = CGPoint(x: frame.width / 2, y: frame.height / 2)
            shapeLayer.fillColor = UIColor.clear.cgColor
            shapeLayer.strokeColor = strokeColor.cgColor
            shapeLayer.lineWidth = lineWidth
            shapeLayer.lineJoin = kCALineJoinRound
            shapeLayer.lineDashPattern = [4, 4]
    
            let path = CGMutablePath()
            path.move(to: CGPoint.zero)
            path.addLine(to: CGPoint(x: frame.width, y: 0))
            shapeLayer.path = path
    
            layer.addSublayer(shapeLayer)
        }
    }
    
    0 讨论(0)
提交回复
热议问题