使用UIPanGestureRecognizer,只能在UIImageview框架中拖动



可用拖拽UIView frame Not In UIImageView frame我使用以下代码使用UIPanGestureRecognizer

 UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture1:)];
    [panGesture setMinimumNumberOfTouches:1];
    [self.imageView setBounds:CGRectMake(self.imageView.frame.origin.x,self.imageView.frame.origin.y ,self.imageView.frame.size.width, self.imageView.frame.size.height)];
    [panGesture setMaximumNumberOfTouches:1];
    panGesture.delegate=self;
    [title addGestureRecognizer:panGesture];
    panGesture = nil;

和我的动作方法

-(void)handlePanGesture1:(UIPanGestureRecognizer *)sender
{
  CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self.imageView];
  if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) 
{
     firstX = [[sender view] center].x;
     firstY = [[sender view] center].y;
}
 translatedPoint = CGPointMake(firstX+translatedPoint.x, firstY+translatedPoint.y);
    [[sender view] setCenter:translatedPoint];
}

那么,你应该使用这样的东西来限制你的x,y:

    CGFloat maxPossibleX = CGRectGetMaxX(self.imageView.frame) - (CGRectGetWidth(sender.view.bounds)/2.0f);
    CGFloat maxPossibleY = CGRectGetMaxY(self.imageView.frame) - (CGRectGetHeight(sender.view.bounds) /2.0f);
    CGFloat minPossibleX = CGRectGetMinX(self.imageView.frame) + CGRectGetMidX(sender.view.bounds);
    CGFloat minPossibleY = CGRectGetMinY(self.imageView.frame) + CGRectGetMidY(sender.view.bounds);

    CGFloat actualX = translatedPoint.x;
    actualX= MAX(minPossibleX, actualX);
    actualX = MIN(maxPossibleX, actualX);
    CGFloat actualY = translatedPoint.y;
    actualY= MAX(minPossibleY, actualY);
    actualY = MIN(maxPossibleY, actualY);
    translatedPoint = CGPointMake(actualX, actualY);

我假设你的标签不是你的imageView的子视图。如果你的标签是imageView的子视图

    CGFloat maxPossibleX = CGRectGetMaxX(self.imageView.bounds) - (CGRectGetWidth(sender.view.bounds)/2.0f);
    CGFloat maxPossibleY = CGRectGetMaxY(self.imageView.bounds) - (CGRectGetHeight(sender.view.bounds) /2.0f);
    CGFloat minPossibleX = CGRectGetMidX(sender.view.bounds);
    CGFloat minPossibleY = CGRectGetMidY(sender.view.bounds);

    CGFloat actualX = translatedPoint.x;
    actualX= MAX(minPossibleX, actualX);
    actualX = MIN(maxPossibleX, actualX);
    CGFloat actualY = translatedPoint.y;
    actualY= MAX(minPossibleY, actualY);
    actualY = MIN(maxPossibleY, actualY);
    translatedPoint = CGPointMake(actualX, actualY);
编辑:我已经成功地在一个测试项目中测试了这个方法:
-(void)handlePanGesture1:(UIPanGestureRecognizer *)sender
{
    CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self.imageView];
    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan)
    {
        firstX = [[sender view] center].x;
        firstY = [[sender view] center].y;
    }
    translatedPoint = CGPointMake(firstX+translatedPoint.x, firstY+translatedPoint.y);
    CGFloat maxPossibleX = CGRectGetMaxX(self.imageView.bounds) - (CGRectGetWidth(sender.view.bounds)/2.0f);
    CGFloat maxPossibleY = CGRectGetMaxY(self.imageView.bounds) - (CGRectGetHeight(sender.view.bounds) /2.0f);
    CGFloat minPossibleX = CGRectGetMidX(sender.view.bounds);
    CGFloat minPossibleY = CGRectGetMidY(sender.view.bounds);

    CGFloat actualX = translatedPoint.x;
    actualX= MAX(minPossibleX, actualX);
    actualX = MIN(maxPossibleX, actualX);
    CGFloat actualY = translatedPoint.y;
    actualY= MAX(minPossibleY, actualY);
    actualY = MIN(maxPossibleY, actualY);
    translatedPoint = CGPointMake(actualX, actualY);
    [[sender view] setCenter:translatedPoint];
}

最新更新