2016-12-06 8 views
1

Я работаю над проектом, где я хочу, чтобы при касании пользователя двигаться в горизонтальном направлении горизонтальная линия должна рисоваться, а касание пользователя двигаться в вертикальном направлении, тогда вертикальная линия должна рисовать. Просьба предложить некоторое решение с помощью Swift. Я пробовал ниже. Но это розыгрыш свободной линии.Нарисуйте горизонтальную или вертикальную линию, используя touch в iOS

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() 
    } 
+0

вы можете проверить эту ссылку http://stackoverflow.com/questions/4669490/how-to-draw-line-on-touch-event –

+0

что, если пользователь прикасается к экрану и создает путь кривой точек? –

+0

Столько неизвестных! Ваш код говорит: «Есть путь беззерцания, когда начинается касание, прыгайте в положение касания, когда касание движется, тянет линию к новой позиции и отображает результат в новом подуровне, когда заканчивается касание, создайте новый путь безье», , Логика подуровня кажется крайне неэффективной (создание сотен частично повторяющихся подслоев), и создание пути безье кажется излишне обратным, но это не относится к делу. Учитывая объяснение вышеприведенной логики, вы могли бы прояснить, чего вы хотите достичь? – Baglan

ответ

0

Попробуйте это.

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 

     } 
    } 
}