2015-02-28 2 views
11

У меня есть код ниже испытанные, но когда я даю ему ограничение, она становится очень маленьким кругом:Как создать круг с CALayer?

override func drawRect(rect: CGRect) { 
var path = UIBezierPath(ovalInRect: rect) 
fillColor.setFill() 
path.fill() 

//set up the width and height variables 
//for the horizontal stroke 
let plusHeight:CGFloat = 300.0 
let plusWidth:CGFloat = 450.0 

//create the path 
var plusPath = UIBezierPath() 

//set the path's line width to the height of the stroke 
plusPath.lineWidth = plusHeight 

//move the initial point of the path 
//to the start of the horizontal stroke 
plusPath.moveToPoint(CGPoint(
    x:self.bounds.width/2 - plusWidth/2 + 0.5, 
    y:self.bounds.height/2 + 0.5)) 

//add a point to the path at the end of the stroke 
plusPath.addLineToPoint(CGPoint(
    x:self.bounds.width/2 + plusWidth/2 + 0.5, 
    y:self.bounds.height/2 + 0.5)) 

} 
+0

попробовать положить его в viewDidAppear –

+0

нет, не делайте этого – picciano

ответ

15

Измените радиус и заполните цвет как хотите. :)

import Foundation 
import UIKit 

class CircleLayerView: UIView { 
    var circleLayer: CAShapeLayer! 

    override func draw(_ rect: CGRect) { 
     super.draw(rect) 
     if circleLayer == nil { 
      circleLayer = CAShapeLayer() 
      let radius: CGFloat = 150.0 
      circleLayer.path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: 2.0 * radius, height: 2.0 * radius), cornerRadius: radius).cgPath 
      circleLayer.position = CGPoint(x: self.frame.midX - radius, y: self.frame.midY - radius) 
      circleLayer.fillColor = UIColor.blue.cgColor 
      self.layer.addSublayer(circleLayer) 
     } 
    } 
} 
7

rect передается в drawRect область, которая должна быть обновлена, а не размером рисунка , В вашем случае вы, вероятно, просто проигнорируете передаваемый прямоугольник и установите круг в нужный размер.

//// Oval Drawing 
    var ovalPath = UIBezierPath(ovalInRect: CGRectMake(0, 0, 300, 300)) 
    UIColor.whiteColor().setFill() 
    ovalPath.fill() 
+0

Это должно быть принятым ответом. 'ovalInRect' - правильный путь. Другие - обходные пути – thesummersign

2

на основе комбинации @picciano и @Huynh_Inc ответы, я сейчас делаю следующее:

var selectionLayer: CAShapeLayer? 

override func drawRect(rect: CGRect) { 

    super.drawRect(rect) 

    guard selectionLayer == nil else { 
     return 
    } 

    let layer = CAShapeLayer() 

    layer.path = UIBezierPath(ovalInRect: rect).CGPath 
    layer.fillColor = myCoolColor.CGColor 

    self.layer.addSublayer(layer) 

    selectionLayer = layer 
} 
Смежные вопросы