1

UIVIewに2つの正方形の画像があります。ある画像から別の画像に指をドラッグしたら、それらの間に直線を描きたいと思います。

touchLocationtouchesMovedがいずれかの画像のフレームに到達したかどうかを確認するメソッドを処理しました。だから私はいつ描画を開始するか、そしてその間の2つのポイントの論理的な部分を扱いました。

を使用してそれを行う方法がわかりません(void)drawRect:(CGRect)rect。まず、drawRectにNSlogを追加し、2つの線の間に線を引くコードを記述しましたが、それは発生していません。

私もこの質問をチェックしましたが、複数のポイントの間に線をドラッグして描画し続けたいと思います。

    - (void)drawRect:(CGRect)rect
{
    NSLog(@"Draw Rect Entered");
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextSetStrokeColorWithColor(context, [[UIColor blackColor]CGColor]);
    CGContextSetLineWidth(context, 1.0);
    CGContextMoveToPoint(context, 0, 0);
    CGContextAddLineToPoint(context, 20, 20);
    CGContextStrokePath(context);
}
4

2 に答える 2

0

ビューを更新するには、-setNeedsDisplayまたは-setNeedsDisplayInRect:再描画する必要のあるビューを呼び出す必要があります。線を引く必要があると判断したら、タッチハンドラーでこれを行う必要があります。これにより、ビューでメソッドがトリガーされます。直接-drawRect:呼び出すことはありません。-drawRect詳細については、UIViewドキュメントをお読みください。一度作成した線を永続的に存在させたいかどうかはわかりません。削除される可能性がある場合は、線を引くかどうかを決定するブール値によって制御されるifステートメントを追加します。-drawRect:その後、必要に応じて簡単にオフにすることができます。

-drawRect:以下のコメントに基づいて、現在トレースされている線のポイントを格納し、コアグラフィックス関数を使用して一度に1セグメントずつ線を描画して、それらをループするivar配列を作成します。そうすれば、新しいセグメントと以前のすべてのセグメントが再描画のたびに描画されます。はobj-cオブジェクトではないためCGPoint、ラッパークラスを作成するか、obj-C++とを使用する必要がありますstd::vector。固定サイズのC配列を使用することもできます(正確に10ポイントあると言います)-その場合、未使用の座標を無効として定義された任意の値(-500、-500など)にプリセットして追加する必要がありますこれらの値が検出された場合に線分を描画しないロジック。

マイナーポイント-ライン座標をハードコーディングしません-代わりに、画像のframeプロパティからそれらを導出できます。そうすれば、コードが読みやすくなり、画像を変更したりサイズを変更したりしても壊れることはありません。

于 2013-03-08T14:34:16.037 に答える
0

この問題を引き起こす可能性のある2つの問題が発生しました
。1)setNeedsDisplayメインスレッドで呼び出していることを確認します
。2)複数のビューで作業している場合はsetNeedsDisplay、正しいビューに対して呼び出していることを確認します。1つのビューで作業し、親ビューに対して
呼び出すのを忘れるのは簡単です。setNeedsDisplay

于 2013-03-12T12:46:15.743 に答える