现在,我有这个代码创建一个呼吸描记器的视图,然后在操场视图控制器中实例化它:
class Spirograph: UIView {
var insideRadius: CGFloat = 1 {
didSet {
updatePath()
}
}
var rotationalSpeed: CGFloat = -31.0 / 3.0 {
didSet {
updatePath()
}
}
private lazy var shapeLayer: CAShapeLayer = {
let sl = CAShapeLayer()
sl.fillColor = UIColor.clear.cgColor
sl.strokeColor = UIColor.purple.cgColor
sl.lineWidth = 2
return sl
}()
override func layoutSubviews() {
super.layoutSubviews()
layer.addSublayer(shapeLayer)
updatePath()
}
private func updatePath() {
let path = UIBezierPath()
let multiplier = frame.width / 5
path.move(to: CGPoint(x: multiplier*(1+insideRadius) + bounds.midX, y: bounds.midY))
for t in 0 ... 2000 {
let angle = CGFloat(t) * .pi / 180.0
let x = cos(angle) + insideRadius * cos(rotationalSpeed * angle)
let y = sin(angle) + insideRadius * sin(rotationalSpeed * angle)
path.addLine(to: CGPoint(x: multiplier * x + bounds.midX, y: multiplier * y + bounds.midY))
}
shapeLayer.path = path.cgPath
}
}
然后实时观察:
class MyViewController : UIViewController {
let spirograph = Spirograph(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
let slider = UISlider(frame: CGRect(x: 0, y: 300, width: 300, height: 20))
@objc func sliderMoved() {
spirograph.insideRadius = CGFloat(slider.value)
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .blue
spirograph.backgroundColor = .white
slider.minimumValue = 0
slider.maximumValue = 1
slider.isContinuous = true
slider.tintColor = .orange
slider.addTarget(self, action: #selector(sliderMoved), for: .valueChanged)
view.addSubview(slider)
view.addSubview(spirograph)
}
}
每当我移动滑块时,即使是一点点,也需要15秒才能绘制新的肺活量计可能是因为我没有在sliderMoved func中正确更改insideRadius变量 < / p>
更新: 我在一个xcode项目中运行相同的代码,它工作得很好,似乎操场无法处理这种类型的代码。
谢谢你的帮助!