我有一个拼图类型的应用程序,用户可以在其中拿起 40 个拼图块中的任何一个,然后在屏幕上拖动它们。在测试中,我注意到一些用户不小心将碎片掉到了屏幕边界之外,并且碎片无法找回。
我如何指定碎片不能移动到视图范围之外?
谢谢你。
我有一个拼图类型的应用程序,用户可以在其中拿起 40 个拼图块中的任何一个,然后在屏幕上拖动它们。在测试中,我注意到一些用户不小心将碎片掉到了屏幕边界之外,并且碎片无法找回。
我如何指定碎片不能移动到视图范围之外?
谢谢你。
我倾向于有一个策略,当触摸结束时,我检查所讨论的 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 属性来访问您正在移动的视图。