2016-10-05 20 views
0

私は現在、描画アプリケーションを開発しようとしています。私が遭遇した問題は、アプリのパフォーマンスを最適化することです。CGImageの上に線を描く

私はUIViewをサブクラス化しました。ユーザーの入力を検出しています。

最初にCoreGraphicsを使用してすべての線をdraw(_ rect: CGRect)メソッドで描画しようとしましたが、線数が10 000+のとき、その遅延が非常に目立つようになりました。それで、私はCGImageを作成して、毎回draw(...)サイクル後に次の描画サイクルが来たら、そのCGImageの上に新しいラインを置くことにしました。したがって、すべての前のラインを再び描画せず、貴重な時間を節約します。

touchesBegan()touchesMoved()の方法で改行を登録してから、self.needsDisplay()に電話しています。

これは私が現在使用していますコードです:

var mainImage: CGImage? 
var newLines: [Line] 

override func draw(_ rect: CGRect) { 

    let context = UIGraphicsGetCurrentContext() 

    //context?.translateBy(x: 0, y: bounds.height) 
    //context?.scaleBy(x: 1, y: -1) 

    if let image = mainImage { 
     context?.draw(image, in: bounds) 
    } 

    for line in newLines { 
     context?.setStrokeColor(UIColor.black.cgColor) 
     context?.setLineWidth(1) 

     context?.move(to: line.previousLocation) 
     context?.addLine(to: line.location) 

     context?.strokePath() 
    } 
    newLines = [] 

    mainImage = context?.makeImage() 
} 

を今の問題は、私が描くラインは2つの部分に分割されており、垂直方向にミラーリングされていることです。 (Image split vertically)。ここでは、直線と曲線の2つの連続した線を描いています。奇妙なことは、もし私がUIViewの半分を反転させた場合、それらの線はそれらの間に隙間なく連続的に揃えられることである。

前述のコード(context?.translateBy(x: 0, y: bounds.height)context?.scaleBy(x: 1, y: -1))から2行のコメントを外した場合、image would look like this

唯一の間違ったことは、画面の下側に描画し、上側に結果を得ることです。

どうすれば修正できますか?私の問題の適切な解決策は何ですか?

ありがとうございました!

答えて

0

これらの2行をコメントアウトすると、グラフィックスコンテキストを変更していません。コメントを外すと、各呼び出しでコンテキストを変更し、保存しません。だから、あなたは本質的に毎回それを反転していると思う。それは確かではありませんが、描画する前にコンテキストをプッシュ/セーブする必要があります(明らかに復元/ポップする)。

この投稿を見る:using UIImage drawInRect still renders it upside down.

+0

はい、本当に!私の翻訳と縮尺線の後に 'context?.saveGState()'を追加し、 'context?.restoreGState()'を追加することで、画像が完全に描画されます!ありがとう! – Kansway