Swift - 按下时为按钮创建径向线
Swift - Create radial line for button when pressed
我被要求在按下按钮时以编程方式创建径向线效果,如下面的按钮 7 所示,但不确定从哪里开始重新创建此效果。
我猜这是使用 CALayer 完成的,对吗?我不是要代码,但如果有人能把我推向正确的方向,那就太棒了。
谢谢!
如果要绘制一个简单的几何图案,为什么不直接用代码绘制呢?这是我对您的径向图像的渲染:
这是生成它的测试应用的完整代码:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let c1 = UIColor(red: 140/255.0, green: 240/255.0, blue: 209/255.0, alpha: 1)
let c2 = UIColor(red: 59/255.0, green: 150/255.0, blue: 123/255.0, alpha: 1)
let iv = UIImageView(image:self.radialLinesImage(
size:CGSize(width:200, height:200), div:20,
c1:c1, c2:c2))
iv.frame.origin = CGPoint(x:100, y:100)
self.view.addSubview(iv)
}
func radialLinesImage(size:CGSize, div:CGFloat, c1:UIColor, c2:UIColor) -> UIImage {
let r = UIGraphicsImageRenderer(size: size)
return r.image { ctx in
c1.setFill()
ctx.fill(CGRect(origin:.zero, size:size))
c2.setFill()
let p = UIBezierPath()
let c = CGPoint(x:size.width/2, y:size.height/2)
for i in 0..<Int(div) {
let a = CGFloat.pi/(div/2) * CGFloat(i)
p.addArc(withCenter: c,
radius: size.width+size.height,
startAngle: a, endAngle: a+CGFloat.pi/div,
clockwise: true)
p.addLine(to: c)
p.fill()
}
}
}
}
我被要求在按下按钮时以编程方式创建径向线效果,如下面的按钮 7 所示,但不确定从哪里开始重新创建此效果。
我猜这是使用 CALayer 完成的,对吗?我不是要代码,但如果有人能把我推向正确的方向,那就太棒了。
谢谢!
如果要绘制一个简单的几何图案,为什么不直接用代码绘制呢?这是我对您的径向图像的渲染:
这是生成它的测试应用的完整代码:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let c1 = UIColor(red: 140/255.0, green: 240/255.0, blue: 209/255.0, alpha: 1)
let c2 = UIColor(red: 59/255.0, green: 150/255.0, blue: 123/255.0, alpha: 1)
let iv = UIImageView(image:self.radialLinesImage(
size:CGSize(width:200, height:200), div:20,
c1:c1, c2:c2))
iv.frame.origin = CGPoint(x:100, y:100)
self.view.addSubview(iv)
}
func radialLinesImage(size:CGSize, div:CGFloat, c1:UIColor, c2:UIColor) -> UIImage {
let r = UIGraphicsImageRenderer(size: size)
return r.image { ctx in
c1.setFill()
ctx.fill(CGRect(origin:.zero, size:size))
c2.setFill()
let p = UIBezierPath()
let c = CGPoint(x:size.width/2, y:size.height/2)
for i in 0..<Int(div) {
let a = CGFloat.pi/(div/2) * CGFloat(i)
p.addArc(withCenter: c,
radius: size.width+size.height,
startAngle: a, endAngle: a+CGFloat.pi/div,
clockwise: true)
p.addLine(to: c)
p.fill()
}
}
}
}