在手指下拖动UIView

时间:2011-02-12 20:47:43

标签: iphone uiview itunes move drag

我想点击UIView并拖动并按照我的手指操作,简单就够了。但最简单的方法是将对象中心设置为点击发生的位置(这不是我想要的),我希望它移动,就好像你在任何地方抓住它一样抓住了对象。

有一种非常有用的方法可以做到这一点,它是在其中一个iTunes U视频中引用的。该脚本没有使用deltaX,deltaY来拖动你点击它下面的图像,而不是让它在你的手指下面居中但是我不记得那个代码是什么了!

有没有人引用此代码?或者也许有一种有效的方法可以在没有uiview.center = tap.center概念的情况下在手指下移动UIViews?

4 个答案:

答案 0 :(得分:11)

以下代码是一个简单的手势识别器示例,它允许面板/视图移动。您不是修改中心,而是修改原点[基本上通过为目标视图设置新框架]。

您可以在您的情况下对此进行优化,这样您就不必深入了解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)!)
    }

答案 1 :(得分:7)

以下是来自Apple的MoveMe项目的代码,关键是在touchesMoved方法中执行此操作。它允许UIViewPlacardView)看到触摸并移动到用户触摸的任何位置。希望这会有所帮助。

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

答案 2 :(得分: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];
}

答案 3 :(得分:0)

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