-2

最近、アプリを最新の Retina iPad に対応させましたが、描画がぼやけてしまいます。それから contextWithOptions を変更してみましたが、描画するとラグが発生しギザギザになりました。私が試したことはすべてうまくいきません。何か案は?

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    mouseSwiped = YES;

    UITouch *touch = [touches anyObject];
    CGPoint currentPoint = [touch locationInView:self.view];
    if (UIGraphicsBeginImageContextWithOptions != NULL) {
        UIGraphicsBeginImageContextWithOptions((self.view.frame.size), NO, 1);
        //becomes laggy if I set it to 0 or 2. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    } else {
        UIGraphicsBeginImageContext(self.view.frame.size);
    }
    [self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush );
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1.0);
    CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeNormal);

    CGContextStrokePath(UIGraphicsGetCurrentContext());
    self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();
    [self.tempDrawImage setAlpha:opacity];
    UIGraphicsEndImageContext();

    lastPoint = currentPoint;
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    if(!mouseSwiped) {
        UIGraphicsBeginImageContext(self.view.frame.size);
        [self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
        CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
        CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush);
        CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, opacity);
        CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
        CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
        CGContextStrokePath(UIGraphicsGetCurrentContext());
        CGContextFlush(UIGraphicsGetCurrentContext());
        self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }

      UIGraphicsBeginImageContextWithOptions((self.view.frame.size), NO, 0);
    [self.mainImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) blendMode:kCGBlendModeNormal alpha:1.0];
    [self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) blendMode:kCGBlendModeNormal alpha:opacity];
    self.mainImage.image = UIGraphicsGetImageFromCurrentImageContext();
    self.tempDrawImage.image = nil;
    UIGraphicsEndImageContext();
}

ユーザーがタッチを終了したときに画像を変更する必要がありますか?何か助けてください。

4

1 に答える 1

1

正解です。ビュー内のすべてのタッチに対して画像を作成しようとする必要はありません。あなたはただ自分の道を描きたいだけです。または、より正確には、タッチ ジェスチャで (a) 一連のパスの配列 (各パス自体がポイントの配列) で構成されるモデルを更新する必要があります。(b) 更新されたモデルの UI を更新するために必要な呼び出しを呼び出します。

図面をレンダリングするには、次の 2 つの基本的な方法があります。

  1. 一連のパスを反復処理して描画するメソッドをUIView持つサブクラスを作成します。drawRectまた

  2. CAShapeLayerパスを使用する を作成してから を実行します[self.view.layer addSublayer:layer]

テクニックはどちらでも構いません。ただし、これらのテクニックのどちらでも、ジェスチャ中にUIGraphicsBeginImageContextUIGraphicsGetImageFromCurrentImageContext、およびを実行しないことに注意してください。UIGraphicsEndImageContextこれは、描画を画像として保存する場合にのみ行います (おそらく、ユーザーの描画ジェスチャが完了した後)。

しかし、このようにすれば、Retina スクリーン上であっても、ユーザーのジェスチャにまったく問題なく追従できます。画像の操作は遅く、メモリ効率の悪いプロセスであるため、慎重に行う必要があります。

ちなみに、この一連のパスを図面のモデルの中心部分として作成すると、他の機会も開かれます。たとえば、パス オブジェクトをモデルから削除してビューを再レンダリングするだけで、パスを簡単に「元に戻す」ことができます。しかし、画像として保存した場合、いくつかのストロークを削除することは実際的ではありません.

最後に、アプリをベクター描画アプリにするか (保存したファイルはパスの配列で、おそらく画像を保存するオプションもある)、ビットマップ エディターにするか (どこで、最後に、ベクトル情報を破棄し、ビットマップのみを保存します)。採用するアプローチに関係なく、ジェスチャ中にパス オブジェクトを使用すると、UI の応答性が向上する可能性があります。

于 2013-10-18T05:11:18.190 に答える