user2397282
user2397282

Reputation: 3818

Swift - Create circle and add to array

I've been looking for a little while on how to create a circle in Swift, but it seems quite complicated. I want to create a circle at run time, with a specified x and y, and width and height. I then want to add this circle to an array where I can create more circles and add to it.

How do I do this?

Edit: This is what I've tried so far:

var center : CGPoint = touchLocation

var myContext : CGContextRef = UIGraphicsGetCurrentContext()

let color : [CGFloat] = [0, 0, 1, 0.5]
CGContextSetStrokeColor (myContext, color);
CGContextStrokeEllipseInRect (myContext, CGRectMake(touchLocation.x, touchLocation.y, 20, 20));

touchLocation is the location of the users finger. This crashes on execution on this line:

var myContext : CGContextRef = UIGraphicsGetCurrentContext()

The error says "Unexpectedly found nil while unwrapping an Optional value

Also, this doesn't allow me to add the circle to an array, because I don't know what variable type it is.

Upvotes: 0

Views: 1853

Answers (2)

Grimxn
Grimxn

Reputation: 22487

Your code is not "creating" a circle as an object, it is attempting to draw one in the graphics context. What you need to do is to create a bezier path object, draw into that and save the path in your array. Something like:

    var circleArray = [CGMutablePathRef]()
    // ...
    let path: CGMutablePathRef = CGPathCreateMutable()
    CGPathAddArc(path, nil, touchLocation.x, touchLocation.y, radius, 0, M_PI * 2, true)
    circleArray  += [path]

You then need to stroke the path(s) in your draw routine.

Upvotes: 0

Chris Conover
Chris Conover

Reputation: 9039

There are many ways to draw a circle, here is a snippet that I have been hacking with:

func circleWithCenter(c:CGPoint, radius r:CGFloat,
    strokeColor sc: UIColor = UIColor.blackColor(),
    fillColor fc: UIColor = UIColor.clearColor()) -> CAShapeLayer {

        var circle = CAShapeLayer()
        circle.frame = CGRect(center:c, size:CGSize(width:2*r, height:2*r))
        circle.path = UIBezierPath(ovalInRect:circle.bounds).CGPath
        circle.fillColor = fc.CGColor
        circle.strokeColor = sc.CGColor
        circle.fillColor = fc == UIColor.clearColor() ? nil : fc.CGColor
        return circle
}

Note that I extended CGRect (using Swift specific features) to add a initializer that takes a center, but that is not material to your question.

Upvotes: 1

Related Questions