0

ドラッグして描画するための非常に単純なコードがあります。

3 つのビュー: ルート ビューは基本的にウィンドウです (いくつかのインターフェイス コントロールを備えています)。その中に、「キャンバス」ビューがあります。キャンバス ビュー内には、ユーザーがキャンバス内で「ドラッグ」するための 3 番目のビュー (キャラクターの小さなグラフィック) があります。ドラッグは問題なく動作します。

問題は、キャンバスの境界内に「キャラクター」を制限できないように見えることです。理想的には、キャンバスの端に出くわしたときに停止する必要があります (ルート ビューにこぼれません)。

キャンバス ビューはサブビューをクリップします。だから彼は端を越えると姿を消します - しかし、私は彼が消えてほしくない、彼がそれ以上行けないようにしたい.

また、アニメーションの前に CGRectIsWithinRect を呼び出します。原則として、これでうまくいくはずです。問題は、アニメーションの発生中にキャラクターのフレームが更新されないことです。そのため、キャラクターがすでに動いている限り、キャラクターはページの右端を動き続けます。

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {


UIView * charView = [[canvasView floatingView] retain];

CGPoint pt = [[touches anyObject] locationInView:canvasView];

if (CGRectContainsPoint([canvasView bounds], pt)) {

    CGRect charFrame = charView.frame;
    CGRect containerFrame = canvasView.frame;
    BOOL inTheYard= CGRectContainsRect(containerFrame, charFrame);

    if (inTheYard == NO) {
        //if we're at the edge, don't go any further
        return;
    }


    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:.2];

    CGFloat x = floatingView.center.x + (pt.x - startPoint.x);
    CGFloat y = floatingView.center.y + (pt.y - startPoint.y);

    CGPoint middle = CGPointMake(x,y);

    floatingView.center = middle;

    [UIView commitAnimations];
    [floatingView release];
}
}

彼がスーパービューの端を通り過ぎないようにするにはどうすればよいですか?

4

1 に答える 1

1

タッチ イベントがキャンバス内にあるかどうかを確認する代わりに、キャンバス内にクランプすることができます。タッチ イベントの x 点と y 点を個別に確認し、それらがキャンバスの外にある場合は、キャンバスのその側の壁までキャラクターを移動します。

CGFloat w = canvasFrame.frame.size.width;
CGFloat h = canvasFrame.frame.size.height;

if (pt.x < 0) pt.x = 0;
if (pt.x > w) pt.x = w;
if (pt.y < 0) pt.y = 0;
if (pt.y > h) pt.y = h;

これにより、タッチ イベントが外部にある場合でも、キャンバスの壁に沿ってキャラクターをドラッグし続けることができます (inTheYard チェックを削除した場合)。

于 2011-02-15T08:50:09.193 に答える