2017-09-13 3 views
3

私はコアグラフィックスとswiftを使って1本の直線を描画しようとしています3しかし、touchesmovedを呼び出すと、単一行の代わりに複数の行が作成されます。使用されるコードは以下の通りです:は、スウィフト3とコアグラフィックスで直線を描きます

btw touchesEndは、ユーザーがタッチを終了した後でのみ、1行を作成します。私は彼らが触れるように描かれているラインをユーザに見てほしい。 ありがとうございます。あなたははあなたが現在のイメージを維持してcontextをクリアし、再び保存された画像を描画し、新しい線を引く必要があることの後に現在のcontextまでのラインドロープロセスは、終了しました。を保つ必要がある

+0

'touchesMoved'を上書きしますか?はいの場合は、そのコードを質問に追加してください。 –

+0

@ReinierMelianはあなたのように意味しました:: let touch = touches.last? – mazen

+0

@mazenあなたのコードは私のために働く、あなたはあなたのコードの何かが欠けている? –

答えて

2

終了タッチは現在contextクリーン呼び出されると、それは新しいラインの描画処理を開始した後、現在の画像を保存し、再び

これは完全なコード

import UIKit 

class ViewController2: UIViewController { 

    @IBOutlet weak var drawingPlace: UIImageView! 

    var startTouch : CGPoint? 
    var secondTouch : CGPoint? 
    var currentContext : CGContext? 
    var prevImage : UIImage? 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     let touch = touches.first 
     startTouch = touch?.location(in: drawingPlace) 
    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     for touch in touches{ 
      secondTouch = touch.location(in: drawingPlace) 


      if(self.currentContext == nil) 
      { 
       UIGraphicsBeginImageContext(drawingPlace.frame.size) 
       self.currentContext = UIGraphicsGetCurrentContext() 
      }else{ 
       self.currentContext?.clear(CGRect(x: 0, y: 0, width: drawingPlace.frame.width, height: drawingPlace.frame.height)) 
      } 

      self.prevImage?.draw(in: self.drawingPlace.bounds) 

      let bezier = UIBezierPath() 

      bezier.move(to: startTouch!) 
      bezier.addLine(to: secondTouch!) 
      bezier.close() 


      UIColor.blue.set() 

      self.currentContext?.setLineWidth(4) 
      self.currentContext?.addPath(bezier.cgPath) 
      self.currentContext?.strokePath() 
      let img2 = self.currentContext?.makeImage() 
      drawingPlace.image = UIImage.init(cgImage: img2!) 
     } 
    } 

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 

     self.currentContext = nil 
     self.prevImage = self.drawingPlace.image 
    } 
} 

結果

enter image description here

です
+1

皆さん、ありがとうございました。あなたにもう一度ありがとうございます: ') – mazen

+0

あなたの歓迎@マゼンあなたを助けてくれることをうれしく思います。 –

+0

'if(self.prevImage!= nil){'は必要ありません。 prevImageがnilの場合は描画メソッドは呼び出されません –

関連する問題