2017-11-28 12 views
0

私はUIImageViewで何かを描画できるアプリケーションを開発しようとしています。私は次のコードを持っています。素早くUIImageViewで描画する

import UIKit 
class Line 
{ 
    var startPoint:CGPoint 
    var endPoint:CGPoint 

    init (start:CGPoint , end:CGPoint) 
    { 
     startPoint = start 
     endPoint = end 
    } 
} 


class AnnotationView: UIView { 

    static internal let nibName = "AnnotationView" 
    @IBOutlet weak var imageView: UIImageView! 
    var lines :[Line] = [] 
    var lastPoint:CGPoint! 


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

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     if let touch = touches.first 
     { 
      let newPoint = touch.location(in:self) 
      lines.append(Line(start: lastPoint, end: newPoint)) 
      lastPoint = newPoint 
      self.setNeedsDisplay() 
     } 
    } 
    override func draw(_ rect: CGRect) { 
     if let context = UIGraphicsGetCurrentContext() 
     { 
      context.beginPath() 
      for line in lines 
      { 
       context.move(to: line.startPoint) 
       context.addLine(to: line.endPoint) 
      } 
      context.setLineCap(CGLineCap.round) 
      context.setStrokeColor(red: 0, green: 0, blue: 0, alpha: 1) 
      context.setLineWidth(5) 
      context.strokePath() 
     } 
    } 
} 

は今、上記のコードで私は、インタフェースビルダーからスーパーのフルサイズに設定UIImageViewを有するのUIViewに由来AnnotationViewクラスを有しています。これは、私がUIImageViewに何かを描きたい、単純な描画アプリケーションです。今問題は、imageView.imageがnilであるときに描画が表示され、imageView.imageにイメージセットがある場合に描画が表示されない場合です。これは、このimageViewで設定されている画像を表示するだけです。両方のシナリオでデバッグしましたが、すべてのメソッドが呼び出されます。確かに私が紛失しているものがあります。誰でも助けてくれますか?私は私のUIImageViewで設定した画像の上に私の図面を表示したい。 よろしく、 ニーナ

答えて

0

問題は、あなたがあなたのUIImageView含め、そのサブビューのいずれかの後ろに置かれAnnotationViewのメイン層で描画していることです。解決策は、AnnotationViewのメインレイヤーにsublayerを追加するように図面を移動することです。

draw()メソッドで線を直接描画する代わりに、図面オーバーレイ用に別のレイヤーを用意する必要があります。あなたのAnnotationViewにこのプロパティを追加します。

let drawingLayer = CAShapeLayer() 

とすぐあなたのビューがストーリーボード/ペン先からロードされるように、この層に他のすべての上にサブレイヤを作るためにawakeFromNib()をオーバーライドします。

override func awakeFromNib() { 
    super.awakeFromNib() 
    layer.addSublayer(drawingLayer) 
} 

今度は、作成してみましょう代わりにsetNeedsDisplay()を呼び出すあなたのオーバーレイを更新する必要があるたびに呼び出す関数:

func updateDrawingOverlay() { 
    let path = CGMutablePath() 

    for line in lines { 
     path.move(to: line.startPoint) 
     path.addLine(to: line.endPoint) 
    } 

    drawingLayer.frame = imageView.frame 
    drawingLayer.path = path 
    drawingLayer.lineWidth = 5 
    drawingLayer.strokeColor = UIColor.black.cgColor 

    setNeedsDisplay() 
} 

はでコードを削除します。 draw(_:)メソッドは今や冗長であるため、をtouchesMoved(_: with:)からupdateDrawingOverlay()コールに置き換えてください。


全部はあなたのために次のようになります。

import UIKit 

class Line { 
    var startPoint:CGPoint 
    var endPoint:CGPoint 

    init (start:CGPoint , end:CGPoint) { 
     startPoint = start 
     endPoint = end 
    } 
} 


class AnnotationView: UIView { 
    static internal let nibName = "AnnotationView" 
    @IBOutlet weak var imageView: UIImageView! 

    var lines :[Line] = [] 
    var lastPoint:CGPoint! 
    let drawingLayer = CAShapeLayer() 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     layer.addSublayer(drawingLayer) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

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

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     if let touch = touches.first 
     { 
      let newPoint = touch.location(in:self) 
      lines.append(Line(start: lastPoint, end: newPoint)) 
      lastPoint = newPoint 
      updateDrawingOverlay() 
     } 
    } 

    func updateDrawingOverlay() { 
     let path = CGMutablePath() 

     for line in lines { 
      path.move(to: line.startPoint) 
      path.addLine(to: line.endPoint) 
     } 

     drawingLayer.frame = imageView.frame 
     drawingLayer.path = path 
     drawingLayer.lineWidth = 5 
     drawingLayer.strokeColor = UIColor.black.cgColor 

     setNeedsDisplay() 
    } 
} 

これはトリックを行う必要があり、私はそれが行く方法を知ってみましょう。

+0

お返事ありがとうございます。画像の有無に関わらず、何も描画していません... – neena

+0

@neena新しいバージョンをコピーして貼り付けてください。私は 'init(frame:)'を 'awakeFromNib()'に置き換えてオーバーレイを追加する前に画像ビューがロードされていることを確認してください。働いているかどうか私に教えてください。 – nshuman

+0

それはうまくいった。ご協力いただきありがとうございます! – neena

関連する問題