Draw dotted (not dashed!) line, with IBDesignable in 2017

前端 未结 10 1653
死守一世寂寞
死守一世寂寞 2020-11-28 03:25

It\'s easy to draw a dashed line with UIKit. So:

CGFloat dashes[] = {4, 2};
[path setLineDash:dashes count:2 phase:0];
[path stroke];


        
相关标签:
10条回答
  • 2020-11-28 04:05

    Hello guys this solution worked for me fine. I found somewhere and changed a bit to prevent console warnings.

    extension UIImage {
        static func drawDottedImage(width: CGFloat, height: CGFloat, color: UIColor) -> UIImage {
            let path = UIBezierPath()
            path.move(to: CGPoint(x: 1.0, y: 1.0))
            path.addLine(to: CGPoint(x: width, y: 1))
            path.lineWidth = 1.5           
            let dashes: [CGFloat] = [path.lineWidth, path.lineWidth * 5]
            path.setLineDash(dashes, count: 2, phase: 0)
            path.lineCapStyle = .butt
            UIGraphicsBeginImageContextWithOptions(CGSize(width: width, height: height), false, 2)
            color.setStroke()
            path.stroke()
    
            let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
            UIGraphicsEndImageContext()
    
            return image
        }
    }
    

    This is the result:

    0 讨论(0)
  • 2020-11-28 04:07

    In swift 3.1 you can use below code:

    context.setLineCap(.round)
    

    Have three styles:

     /* Line cap styles. */
    
    public enum CGLineCap : Int32 {
    
        case butt
    
        case round
    
        case square
    }
    
    0 讨论(0)
  • 2020-11-28 04:11

    I work a bit on rob mayoff accepted solution to easily customize the dotted line:

    • change the radius of each circle.
    • change the number of spaces between 2 circles.
    • change the number of patterns to generate.

    The function return an UIImage:

    extension UIImage {
    
        class func dottedLine(radius radius: CGFloat, space: CGFloat, numberOfPattern: CGFloat) -> UIImage {
    
    
            let path = UIBezierPath()
            path.moveToPoint(CGPointMake(radius/2, radius/2))
            path.addLineToPoint(CGPointMake((numberOfPattern)*(space+1)*radius, radius/2))
            path.lineWidth = radius
    
            let dashes: [CGFloat] = [path.lineWidth * 0, path.lineWidth * (space+1)]
            path.setLineDash(dashes, count: dashes.count, phase: 0)
            path.lineCapStyle = CGLineCap.Round
    
    
            UIGraphicsBeginImageContextWithOptions(CGSizeMake((numberOfPattern)*(space+1)*radius, radius), false, 1)
            UIColor.whiteColor().setStroke()
            path.stroke()
            let image = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
    
            return image
    
        }
    }
    

    And here is how to get the image:

    UIImage.dottedLine(radius: 100, space: 2, numberOfPattern: 1)
    
    0 讨论(0)
  • 2020-11-28 04:12

    I have implemented following piece of code to add border with dotted style at bottom of titleLabel (UILabel) in viewDidAppear:

    CAShapeLayer *shapelayer = [CAShapeLayer layer];
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:CGPointMake(0.0, titileLabel.frame.size.height-2)];
    [path addLineToPoint:CGPointMake(SCREEN_WIDTH, titileLabel.frame.size.height-2)];
    UIColor *fill = [UIColor colorWithRed:0.80f green:0.80f blue:0.80f alpha:1.00f];
    shapelayer.strokeStart = 0.0;
    shapelayer.strokeColor = fill.CGColor;
    shapelayer.lineWidth = 2.0;
    shapelayer.lineJoin = kCALineJoinRound;
    shapelayer.lineDashPattern = [NSArray arrayWithObjects:[NSNumber numberWithInt:2],[NSNumber numberWithInt:3 ], nil];
    shapelayer.path = path.CGPath;
    
    [titileLabel.layer addSublayer:shapelayer];
    

    Refrence : https://gist.github.com/kaiix/4070967

    0 讨论(0)
  • 2020-11-28 04:18

    Objective-C version of the Swift example above:

    UIBezierPath * path = [[UIBezierPath alloc] init];
    [path moveToPoint:CGPointMake(10.0, 10.0)];
    [path addLineToPoint:CGPointMake(290.0, 10.0)];
    [path setLineWidth:8.0];
    CGFloat dashes[] = { path.lineWidth, path.lineWidth * 2 };
    [path setLineDash:dashes count:2 phase:0];
    [path setLineCapStyle:kCGLineCapRound];
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(300, 20), false, 2);
    [path stroke];
    UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    0 讨论(0)
  • 2020-11-28 04:18

    Using a UIView extension, compatible with Swift 3.0 the following should work:

    extension UIView {
    
        func addDashedBorder(strokeColor: UIColor, lineWidth: CGFloat) {
            self.layoutIfNeeded()
            let strokeColor = strokeColor.cgColor
    
            let shapeLayer:CAShapeLayer = CAShapeLayer()
            let frameSize = self.frame.size
            let shapeRect = CGRect(x: 0, y: 0, width: frameSize.width, height: frameSize.height)
    
            shapeLayer.bounds = shapeRect
            shapeLayer.position = CGPoint(x: frameSize.width/2, y: frameSize.height/2)
            shapeLayer.fillColor = UIColor.clear.cgColor
            shapeLayer.strokeColor = strokeColor
            shapeLayer.lineWidth = lineWidth
            shapeLayer.lineJoin = kCALineJoinRound
    
            shapeLayer.lineDashPattern = [5,5] // adjust to your liking
            shapeLayer.path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: shapeRect.width, height: shapeRect.height), cornerRadius: self.layer.cornerRadius).cgPath
    
            self.layer.addSublayer(shapeLayer)
        }
    
    }
    

    Then in a function that runs after viewDidLoad, like viewDidLayoutSubviews, run the addDashedBorder function on the view in question:

    class ViewController: UIViewController {
    
        var someView: UIView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            someView = UIView()
            someView.layer.cornerRadius = 5.0
    
            view.addSubview(someView)
    
            someView.translatesAutoresizingMaskIntoConstraints = false
            someView.widthAnchor.constraint(equalToConstant: 200).isActive = true
            someView.heightAnchor.constraint(equalToConstant: 200).isActive = true
            someView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
            someView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        }
    
        override func viewDidLayoutSubviews() {
            someView.addDashedBorder(strokeColor: UIColor.red, lineWidth: 1.0)
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题