web-dev-qa-db-ja.com

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))

}
16
Tycoon

必要に応じて半径と塗りつぶし色を変更します。 :)

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)
        }
    }
}
20
Huynh Inc

rectに渡されるdrawRectは、図面のサイズではなく、更新が必要な領域です。あなたの場合、おそらく渡される長方形を無視して、円を必要なサイズに設定します。

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

@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   
}
2
ChrisH