Iphone 在视图中拖动视图,并将其约束在

Iphone 在视图中拖动视图,并将其约束在,iphone,core-animation,uitouch,Iphone,Core Animation,Uitouch,我有一个非常简单的拖动和绘图代码 三个视图:根视图基本上是窗口(带有一些界面控件)。 在它里面,我有一个“画布”视图。在画布视图中,我有第三个视图(角色的小图形),用户要在画布中“拖动”它。拖动工作正常 问题是我似乎无法将我的“角色”限制在画布的范围内。理想情况下,当他跑进画布边缘时,他应该停下来(不要溢出到根视图中) 画布视图剪辑子视图;所以,一旦他越过边缘,他就会消失——但我不希望他消失,我希望他不能再往前走了 在我的动画之前,我也会调用CGRectIsWithinRect,原则上应该这样做

我有一个非常简单的拖动和绘图代码

三个视图:根视图基本上是窗口(带有一些界面控件)。 在它里面,我有一个“画布”视图。在画布视图中,我有第三个视图(角色的小图形),用户要在画布中“拖动”它。拖动工作正常

问题是我似乎无法将我的“角色”限制在画布的范围内。理想情况下,当他跑进画布边缘时,他应该停下来(不要溢出到根视图中)

画布视图剪辑子视图;所以,一旦他越过边缘,他就会消失——但我不希望他消失,我希望他不能再往前走了

在我的动画之前,我也会调用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];
}
}

我怎样才能防止他越过superview的边缘?

而不是检查触摸事件是否在画布内部,您可以将其夹在画布内部。分别检查触摸事件的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;
CGFloat w=canvasFrame.frame.size.width;
CGFloat h=canvasFrame.frame.size.height;
如果(pt.x<0)pt.x=0;
如果(pt.x>w)pt.x=w;
如果(pt.y<0)pt.y=0;
如果(pt.y>h)pt.y=h;
这将允许您在触摸事件位于外部时(如果您删除了院内检查),也可以沿画布的墙壁继续拖动角色