1

私は、ユーザーが40個のジグソーピースのいずれかを拾い上げて画面上でドラッグできるジグソータイプのアプリケーションを持っています。テスト中に、一部のユーザーが誤って画面の境界の外にピースを落とし、ピースを取得できなかったことに気づきました。

ビューの境界の外にピースを移動できないように指定するにはどうすればよいですか?

ありがとうございました。

4

1 に答える 1

2

私は、タッチが終了したときに、問題のCGRectの境界がスーパービューの範囲外にあるかどうかを確認するという戦略をとる傾向があります。もしそうなら、私はそれをアニメーション化してビューに戻します。

移動中のビューオブジェクトにアクセスできるようにするこれらのタイプの動作には、通常UIPanGestureRecognizerを使用するため、これがどのように実装されるかはわかりません。そうは言っても、ビューオブジェクトがivarの場合、次のようになります。

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

    //note: pieceView is your ivar for the view being moved.
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    void(^animationBlock)(void);  

    if ((pieceView.frame.origin.x + pieceView.frame.size.width) > screenRect.size.width) { //outside right side
        animationBlock = ^{
           int newXVal = (screenRect.size.width - (pieceView.frame.size.width/2));
            pieceView.center = CGPointMake(newXVal, pieceView.center.y);
        };
    }
    else if (pieceView.frame.origin.x < 0.0f) { //outside left side
        animationBlock = ^{
            int newXVal = -(pieceView.frame.size.width/2);
            pieceView.center = CGPointMake(newXVal, pieceView.center.y);
        };
    }
    else if ((pieceView.frame.origin.y + pieceView.frame.size.height) > screenRect.size.height) { //outside bottom
        animationBlock = ^{
            int newYVal = (screenRect.size.height - (pieceView.frame.size.height/2));
            pieceView.center = CGPointMake(pieceView.center.x, newYVal);
        };
    }
    else if (pieceView.frame.origin.y < 0.0f) { //outside top
        animationBlock = ^{
            int newYVal = -(pieceView.frame.size.height/2);
            pieceView.center = CGPointMake(pieceView.center.x, newYVal);
        };
    }

    [UIView animateWithDuration:0.2 animations:animationBlock];

}

最終的にUIPanGestureRecognizerを使用する場合は、パンジェスチャレコグナイザーのviewプロパティにアクセスすることで、移動しているビューにアクセスできます。

于 2012-05-04T14:20:46.380 に答える