我有一个非常简单的拖动和绘图代码。
三个视图:根视图基本上是窗口(带有一些界面控件)。 在其中,我有一个“画布”视图。在画布视图中,我有第三个视图(一个字符的小图形),用户可以在画布中“拖动”它。拖动效果很好。
问题是我似乎无法在画布的范围内约束我的“角色”。理想情况下,当他跑进画布的边缘时,他应该停下来(不要溢出到根视图中)
画布视图剪辑子视图;所以一旦他超越边缘他就会消失 - 但我不希望他消失,我希望他不能再继续下去了。
我在动画之前也调用了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];
}
}
我如何阻止他超越他的超级视角?
答案 0 :(得分: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支票),这也允许你继续沿着画布的墙壁拖动角色。