2011-02-07 16 views
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]; 
} 
} 

私は彼がスーパービューの端を越えて移動しないようにするにはどうすればよいですか?

答えて

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チェックを外した場合)これは、タッチイベントが外であっても、キャンバスの壁に沿って文字をドラッグして維持することができます。

関連する問題