6

touchesMoved:メソッドに従って線を引いていますが、通常は正常に機能します。しかし、画像を拡大して描画すると、以前に描画された線がずれて、ますますぼやけていき、最終的には消えてしまいます。ofを使用UIPinchGestureRecognizerして単純に増やしてみましたframemyImageView(マルチタッチ イベントの場合のみ)、問題は両方の方法で発生します。描画用のコードは次のとおりです。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
 NSArray *allTouches = [touches allObjects];
 int count = [allTouches count];
 if(count==1){//single touch case for drawing line
    UITouch *touch = [touches anyObject];   
    CGPoint currentPoint = [touch locationInView:myImageView];
    UIGraphicsBeginImageContext(myImageView.frame.size);
    [drawImage.image drawInRect:CGRectMake(0, 0, myImageView.frame.size.width, myImageView.frame.size.height)];
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 2.0);
    CGContextBeginPath(UIGraphicsGetCurrentContext());
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    lastPoint = currentPoint;
 }
else{//multi touch case
   // handle pinch/zoom
  }
}

ズームせずに描画した画像を次に示します。

ここに画像の説明を入力

これは拡大後の問題を示す画像で、赤い矢印は拡大前に既に描画されていたセグメントを示しています (前の画像を参照)。画像はぼやけており、ずれています。

ここに画像の説明を入力

また、最後に向かって描かれた線の一部は影響を受けておらず、時間を遡って描かれた線に対してこの現象が発生することもわかります。この理由は、ズームイン/ズームアウトすると画像サイズ属性が失われ、おそらくぼかしやシフトが発生するためだと思いますが、それについてはわかりません!

編集-何が起こっているかを示す短いビデオをアップロードしました。なんか面白そう…

EDIT 2-これは、問題に焦点を当てたシングルビューアプリのサンプルです

4

3 に答える 3

4

プロジェクトをダウンロードしましたが、問題は自動サイズ変更にあることがわかりました。次の手順で解決します。

手順1.70行目をコメント化します。

drawImage.frame = CGRectMake(0, 0, labOrderImgView.frame.size.width, labOrderImgView.frame.size.height);

あなたのtouchesMoved方法で。

ステップ2.メソッドでdrawImageがalloc編集された後(90行目)に1行のコードを追加しviewDidLoadます。

drawImage.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

その後、バグが修正されます。

于 2012-05-16T05:55:16.023 に答える
1

次の方法でこのような動作を実装しました。

  1. パス (MODEL) のすべての座標を覚えておく必要があります。
  2. imageView の一時的なサブビューにパスを描画します。
  3. ユーザーが画像のピンチ/ズームを開始すると、何もしません。つまり、パスは iOS によってスケーリングされます。
  4. ユーザーがピンチ ズームを終了した瞬間に、モデルを使用して正しい方法でパスを再描画します。

パスを画像として保存すると、結果として見栄えの悪いスケーリングが発生します。また、パスを画像に直接描画しないでください。透明なビューに描画し、編集の最後にそれらを分割します。

于 2012-02-14T18:22:06.837 に答える
1

常に画像ビューのサイズの画像コンテキストに描画しているだけです-ズームインしたときに高解像度に適応しないため、これはもちろんぼやけます.代わりにUIBezierPath一度作成して線を追加する方が賢明です.メソッドで( を使用してaddLineToPoint:)それにアクセスし、を介しtouchesMovedてカスタムメソッドで描画します。イメージ ビューのサブビューとして を追加し、そのプロパティを以前に作成した のプロパティに設定することもできます。drawRect[bezierPath stroke]CAShapeLayerpathCGPathbezierPath

iOS で指でベジエ曲線を描くを参照してください。たとえば。

于 2012-02-14T19:11:04.523 に答える