Uiview 使用UIPangestureRecognitor仅在UIImageview帧中拖动UILable

Uiview 使用UIPangestureRecognitor仅在UIImageview帧中拖动UILable,uiview,uiimageview,uilabel,uigesturerecognizer,uipangesturerecognizer,Uiview,Uiimageview,Uilabel,Uigesturerecognizer,Uipangesturerecognizer,UILable拖动UIView帧不在UIImageView帧中我正在使用以下代码使用uipangestrerecognizer拖动标签 UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture1:)]; [panGesture setMinimumNumberOfTouches:1]; [se

UILable拖动UIView帧不在UIImageView帧中我正在使用以下代码使用uipangestrerecognizer拖动标签

 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];
}

为什么要设置
pangestrue=nil添加到标签时?这将使平移手势指针变为get
nil
这是一种无效的方法。(我猜你是在想非ARC)另外,问题是什么?我是ios新手,但尝试不使用panGesture=nil;但在uiview中发出相同的“我的标签拖动”,而不仅仅是UIImageView,这是因为您应该在
UIImageView
之外以某种方式限制移动。e、 在设置视图位置之前,您可以在计算后设置最大或最小x、y位置,以使标签仅漫游到所需的视图中。我尝试了这个方法,但如果((min_X>=self.imageView.frame.origin.X&&max_X=self.imageView.frame.origin.y&&max_y这是一个太复杂的解决方案。让我用一个更合适的答案来回答你。我正在imageView上使用标签作为子视图,我尝试在uiview(角落)中拖动X=0我的标签修复而不移动到其他位置我已经创建了一个测试项目并测试了我的代码。当我删除行
[self.imageView setBounds:CGRectMake(self.imageView.frame.origin.x,self.imageView.frame.origin.y,self.imageView.frame.size.width,self.imageView.frame.size.height)]时,它可以完美地工作
我不确定您为什么要为图像视图设置边界。使用第二个代码示例,如果丢失该行,它应该会得到修复。很高兴听到,作为旁注:当我尝试拖动lable时,为什么它在UIImageView上从x=0开始,根据我的经验,我没有遇到这样的问题。它可能是在操纵
firstX
首先
。否则它们可能会在某个地方归零。