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 回答