使用 UIPanGestureRecognizer 仅在 UIImageview 框架中拖动 UILabel

Posted

技术标签:

【中文标题】使用 UIPanGestureRecognizer 仅在 UIImageview 框架中拖动 UILabel【英文标题】:Drag UILable in only UIImageview frame Using UIPanGestureRecognizer 【发布时间】:2015-08-04 05:22:51 【问题描述】:

UILable 拖入 UIView 框架而不是 UIImageView 框架我正在使用以下代码使用 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];

【问题讨论】:

添加标签时为什么要设置panGesture = nil;?这将使平移手势指针获得nil 这是一种无效的方法。 (我猜你想的是非 ARC)另外,问题又是什么? 我是 ios 新手,但尝试不使用 panGesture = nil;但在 uiview 中发出相同的标签拖动,不仅是 uiimageview 那是因为你应该以某种方式限制移动超出UIImageView。例如在设置视图位置之前,您可以在计算后设置 Max 或 Min x,y 位置,让标签仅漫游到您想要的视图中。 我尝试了这个,但没有得到正确的 if((min_X >= self.imageView.frame.origin.x && max_X = self.imageView.frame.origin.y && max_Y 这个解决方案太复杂了。让我以更正确的答案回复您。 【参考方案1】:

好吧,您应该使用以下方式限制您的 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];

【讨论】:

我在 imageview 上使用标签作为子视图,我尝试使用此代码将标签拖入 x=0 中的 uiview(角)修复,而不是移动到其他位置 我创建了一个测试项目并在运行中测试了我的代码。当我删除[self.imageView setBounds:CGRectMake(self.imageView.frame.origin.x,self.imageView.frame.origin.y ,self.imageView.frame.size.width, self.imageView.frame.size.height)]; 行时,它可以完美运行我不确定你为什么要为图像视图设置边界。使用第二个代码示例并丢失该行,它应该得到修复。 很高兴听到,就像旁注一样:How to Accept an answer 当我尝试拖动标签时为什么它从 UIImageView 上的 x=0 开始 根据我的经验,我没有遇到这样的问题。可能是在操纵firstXfirstY。或者他们可能会在某个地方归零。

以上是关于使用 UIPanGestureRecognizer 仅在 UIImageview 框架中拖动 UILabel的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 UIPanGestureRecognizer 移动对象时会有延迟?

UIPanGestureRecognizer ***视图未获取事件,子视图使用它们

在 UITableView 上滑动删除以使用 UIPanGestureRecognizer

在 UIPanGestureRecognizer 中使用velocityInView

使用 UIPanGestureRecognizer 拖动 + 旋转触摸下车

使用 UIPanGestureRecognizer 移动和缩放 UIView