在限制范围内拖动UIImageView

时间:2011-07-03 15:29:39

标签: iphone objective-c cocoa-touch

如何才能拖动UIImageView但只能在屏幕的某个区域内?我的代码目前看起来像这样:

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [[event allTouches] anyObject];
    touch.view.frame = CGRectMake(104, 171, 113, 49);

    if([touch view] == toggle)
    {

        CGPoint location = [touch locationInView:self.view];
        CGPoint newLocation = CGPointMake(toggle.center.x, location.y);

        toggle.center = newLocation;
        NSLog(@"%f \n",toggle.center.y);

    }  
}

我希望能够仅在我定义的帧内拖动图像。

2 个答案:

答案 0 :(得分:1)

您可以使用CGRectContainsRect(rect1, rect2)检查第一个矩形是否完全位于第二个

bool CGRectContainsRect (
   CGRect rect1,
   CGRect rect2
);
  

当您使用UIViews并想要查看一个视图是否完全落在一秒钟的帧内时,相关函数CGRectContainsRect将为您进行检查。这不会检查交叉点;两个矩形的并集必须等于第一个矩形才能返回true。该函数有两个参数。第一个矩形始终是周围的项目。第二个参数要么完全落在第一个参数内,要么没有。

所以你的代码可能是这样的

CGPoint location = [touch locationInView:self.view];
CGPoint newLocation = CGPointMake(toggle.center.x, location.y);

CGRect r = CGRectMake(newLocation.x-self.frame.size.width/2, 
                      newLocation.y-self.frame.size.height/2, 
                      self.frame.size.width,
                      self.frame.size.height);
if(CGRectContainsRect(r, theOtherRect)){
    toggle.center = newLocation;
    NSLog(@"%f \n",toggle.center.y);
}

其他有用的CoreGraphics函数:http://blogs.oreilly.com/iphone/2008/12/useful-core-graphics-functions.html

另一个提示:NSLog(@"%@", NSStringFromCGPoint(toggle.center))使CGTypes的记录更容易。等效使用:NSStringFromCGRect(rect)

答案 1 :(得分:0)

if (newLocation.y > NSMaxY(touch.view.frame)) newLocation.y = NSMaxY(touch.view.frame);
if (newLocation.y < NSMinY(touch.view.frame)) newLocation.y = NSMinY(touch.view.frame);
toggle.center = newLocation;

如果您愿意,可以对x坐标执行相同的操作。