问题
I am working on a project where I want that if user touch move in horizontal direction then horizontal line should draw and of user touch move in vertical direction then vertical line should draw. Kindly suggest some solution using Swift. I tried below. But this is drawing free line.
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
let touch: AnyObject? = touches.first
let lastPoint = touch!.previousLocation(in: holderView)
path.move(to: CGPoint(x: lastPoint.x, y: lastPoint.y))
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesMoved(touches, with: event)
let touch: AnyObject? = touches.first
let currentPoint = touch!.location(in: holderView)
path.addLine(to: CGPoint(x: currentPoint.x, y: currentPoint.y))
//Design path in layer
let shapeLayer = CAShapeLayer()
shapeLayer.path = path.cgPath
shapeLayer.strokeColor = UIColor.orange.cgColor
shapeLayer.lineWidth = 20.0
holderView.layer.addSublayer(shapeLayer)
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
path=UIBezierPath()
}
回答1:
Try this.
class DrawingView: UIView {
var path = UIBezierPath()
var initialLocation = CGPoint.zero
var finalLocation = CGPoint.zero
var shapeLayer = CAShapeLayer()
override func awakeFromNib() {
super.awakeFromNib()
setupView()
}
override init(frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setupView(){
self.layer.addSublayer(shapeLayer)
self.shapeLayer.lineWidth = 20
self.shapeLayer.strokeColor = UIColor.blue.cgColor
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
if let location = touches.first?.location(in: self){
initialLocation = location
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesMoved(touches, with: event)
if let location = touches.first?.location(in: self){
let dx = location.x - initialLocation.x
let dy = location.y - initialLocation.y
finalLocation = abs(dx) > abs(dy) ? CGPoint(x: location.x, y: initialLocation.y) : CGPoint(x: initialLocation.x, y: location.y)
path.removeAllPoints()
path.move(to: initialLocation)
path.addLine(to: finalLocation)
shapeLayer.path = path.cgPath
}
}
}
来源:https://stackoverflow.com/questions/40994252/draw-horizontal-or-vertical-line-using-touch-in-ios