我不熟悉编码,一直在尝试在屏幕上划出一个可以用手指签名的区域。我已经做了盒子,但我正在努力清理它。我已经将一个按钮连接到一个函数以清除路径,但是我似乎无法弄清楚如何安全地解开信息而不会崩溃。
import UIKit
class canvasView: UIView {
var lineColour:UIColor!
var lineWidth:CGFloat!
var path:UIBezierPath!
var touchPoint:CGPoint!
var startingPoint:CGPoint!
override func layoutSubviews() {
self.clipsToBounds = true
self.isMultipleTouchEnabled = false
lineColour = UIColor.white
lineWidth = 10
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch = touches.first
startingPoint = (touch?.location(in: self))!
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch = touches.first
touchPoint = touch?.location(in: self)
path = UIBezierPath()
path.move(to: startingPoint)
path.addLine(to: touchPoint)
startingPoint = touchPoint
drawShapelayer()
}
func drawShapelayer(){
let shapeLayer = CAShapeLayer()
shapeLayer.path = path.cgPath
shapeLayer.strokeColor = lineColour.cgColor
shapeLayer.lineWidth = lineWidth
shapeLayer.fillColor = UIColor.clear.cgColor
self.layer.addSublayer(shapeLayer)
self.setNeedsDisplay()
}
func clearCanvas() {
path.removeAllPoints()
self.layer.sublayers = nil
self.setNeedsDisplay()
}
然后我在
之后的最终函数中得到错误path.removeAllPoints()
如何最好将其拆开以防止其崩溃?
感谢您的耐心
答案 0 :(得分:0)
问题在于,如果用户单击之前清除画布,则他/她将绘制任何东西,则将发生错误,因为path
仅在{ {1}}。
您可能想要更改
touchesMoved()
到
var path:UIBezierPath!
尽管这看起来很乏味,因为您必须在尝试访问var path:UIBezierPath?
的方法或属性的任何地方添加问号,但这样做更加安全,并且示例中的代码不会崩溃。
P.S。签出this answer。它提供了有关使用可选选项的大量信息。