手指下移时拖动UIView

10

我想在触摸UIView并拖动时,让该视图跟随我的手指移动,这很简单。但是最简单的方法是将对象的中心设置为触摸发生的位置(这不是我想要的),我希望它能像抓住物体一样移动到任何您点击的地方。

有一种非常有用的方法可以实现此目的,并且在iTunes U视频中引用过。该脚本没有使用deltaX、deltaY来拖动在您点击位置下面的图像,而是以其他方式实现,但我不记得那段代码是什么了!

有人有这个代码的参考资料吗?或者有没有一种有效的方法可以在没有uiview.center = tap.center概念的情况下将UIView移动到手指下面?


1
答案有帮助吗?如果有,请将其标记为正确或回复,否则... - TigerCoding
他回复了 - 但那不是他要找的。 - xil3
你找到解决方案了吗?我很好奇是否有一种没有使用 Delta 的解决方案,就像你所声称看到的那样。 - eric
4个回答

14
下面的代码是一个简单的手势识别器示例,可以允许面板/视图移动。而不是修改中心点,您将修改原点(基本上是通过为目标视图设置新框架来完成)。
您可以根据自己的情况进行优化,以便不必深入到gesture.view等内容中。
-(void)dragging:(UIPanGestureRecognizer *)gesture
{
    if(gesture.state == UIGestureRecognizerStateBegan)
    {
        //NSLog(@"Received a pan gesture");
        self.panCoord = [gesture locationInView:gesture.view];


    }
    CGPoint newCoord = [gesture locationInView:gesture.view];
    float dX = newCoord.x-panCoord.x;
    float dY = newCoord.y-panCoord.y;

gesture.view.frame = CGRectMake(gesture.view.frame.origin.x+dX, gesture.view.frame.origin.y+dY, gesture.view.frame.size.width, gesture.view.frame.size.height);
 }

Swift 4:

@objc func handleTap(_ sender: UIPanGestureRecognizer) {
        if(sender.state == .began) {
            self.panCoord = sender.location(in: sender.view)
        }

        let newCoord: CGPoint = sender.location(in: sender.view)

        let dX = newCoord.x - panCoord.x
        let dY = newCoord.y - panCoord.y

        sender.view?.frame = CGRect(x: (sender.view?.frame.origin.x)!+dX, y: (sender.view?.frame.origin.y)!+dY, width: (sender.view?.frame.size.width)!, height: (sender.view?.frame.size.height)!)
    }

2
你的代码中的“panCoord”是什么? - George Asda
抱歉,panCoord是本地的CGPoint,用于跟踪当前正在平移的位置。我没有意识到存在依赖关系且未解决。请添加一个CGPoint panCoord来存储“从哪里移动”的当前位置。 - binary_falcon

7

以下是来自苹果MoveMe项目的代码,关键在于在touchesMoved方法中执行此操作。它允许UIView(PlacardView)看到触摸并随着用户的触摸移动。希望这能帮到你。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

UITouch *touch = [touches anyObject];

// If the touch was in the placardView, move the placardView to its location
if ([touch view] == placardView) {
    CGPoint location = [touch locationInView:self];
    placardView.center = location;
    return;
   }
}

4
问题在于,如果您在视图之外开始移动手指事件,它会改变其位置,从而导致跳跃。 - Nuno Gonçalves
它已经指向了正确的方向!但当我阅读时,这也是我所想的 :) - Alex Cio

0

我想你在谈论跟踪应用程序...

// Tell the "stalker" rectangle to move to each touch-down
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [UIView beginAnimations:@"stalk" context:nil];
    [UIView setAnimationDuration:1];
    //[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationBeginsFromCurrentState:YES];

    // touches is an NSSet.  Take any single UITouch from the set
    UITouch *touch = [touches anyObject];

    // Move the rectangle to the location of the touch
    stalker.center = [touch locationInView:self];
    [UIView commitAnimations];
}

1
谢谢提供代码,但这不是我想要实现的。我希望对象在我拖动时跟随我的手指移动,以便UIView的中心根据我的手指移动而被位移,而不是围绕手指居中。 - Parad0x13
1
@Parad0x13 你好,你解决了你的问题吗?如果有的话,请告诉我,因为我也遇到了同样的情况,需要解决它。 - Zalak Patel

0

你可以保存触摸的位置(T)和视图的当前位置(O)。在touchMoved方法中,你可以通过添加(O-T)来移动它。


没错,我可以这样做。但是还有另一种更简洁的方法。UIView本身就有一个框架可以实现我想要的功能,而不需要自己进行计算。 - Parad0x13
1
请原谅,您是在询问还是做出肯定的断言? :) 如果您找到了这样的框架,请在此处添加评论(或回答自己的问题),以使知识公开! ;) - Eduardo Costa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接