UIGestureRecognizer 拖拽 UIView

Posted

技术标签:

【中文标题】UIGestureRecognizer 拖拽 UIView【英文标题】:UIGestureRecognizer to Drag UIView 【发布时间】:2012-12-14 13:33:30 【问题描述】:

我正在尝试构建一个GestureRecognizer 以将UIView 从右向左拖动。如果用户将 View 拖到屏幕的一半,View 将自动拖到左角丢弃它,但如果用户没有拖到一半屏幕,它会返回到屏幕的右角。 这里有点迷失,任何教程或什么? 谢谢

编辑:这是一些代码,它是UIImageView,在UIScrollView 内,我需要拖动整个滚动条或其中的图像:

_myScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, self.window.bounds.size.height)]; [_myScroll setContentSize:CGSizeMake(self.window.bounds.size.width , 1300)];

_tutorial = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, 1300)]; [_tutorial setImage:[UIImage imageNamed:@"Default"]];
_tutorial.contentMode = UIViewContentModeScaleAspectFit; [_myScroll addSubview:_tutorial];

_tutorial.userInteractionEnabled = YES;
    UIPanGestureRecognizer * recognizer = [[UIPanGestureRecognizer alloc]initWithTarget:_tutorial action:@selector(handlePan:)]; 
 [_tutorial addGestureRecognizer:recognizer];

    [self.window addSubview:_myScroll];

以及我尝试拖动UIImageView的方法

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer 

    CGPoint translation = [recognizer translationInView:_myScroll];
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                         recognizer.view.center.y + translation.y);
    [recognizer setTranslation:CGPointMake(0, 0) inView:_myScroll];


【问题讨论】:

我回答了你的问题,但你应该提供更多关于你尝试过的细节,比如“我可以拖动视图,但不知道如何让它到正确的位置”, ... @rdurand 是的,我可以使用 UIPanGestureRecognizer 拖动视图,但我不知道如何检测位置,然后将视图发送到所需位置。第二个问题是,如何只水平拖动视图 提供一些代码。告诉我们您尝试了什么,什么不起作用 @rdurand 这是我尝试使用的代码,。 我添加了一些你可以使用的代码 【参考方案1】:

查看here。这是一个UIGestureRecognizer 教程,它将为您提供处理捏合和平移手势的基础知识。一旦你学会了基础知识,就很容易实现你想要的。您只需在平移完成后检查视图的位置,以将其发送到正确的位置。在UIScrollViews 上查看this other tutorial,它可能会帮助您找到第二部分的方法。

两个教程都来自raywenderlich.com,这可能是我所知道的最有用的 ios 教程网站。


这是您可以使用的 handlePan: 方法的一些代码:

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer 

    CGPoint translation = [recognizer translationInView:_myScroll];

    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                         recognizer.view.center.y + translation.y);

    if (recognizer.state == UIGestureRecognizerStateEnded) 

        // Check here for the position of the view when the user stops touching the screen

        // Set "CGFloat finalX" and "CGFloat finalY", depending on the last position of the touch

        // Use this to animate the position of your view to where you want
        [UIView animateWithDuration: aDuration
                              delay: 0 
                            options: UIViewAnimationOptionCurveEaseOut 
                         animations:^
            CGPoint finalPoint = CGPointMake(finalX, finalY);
            recognizer.view.center = finalPoint;  
                         completion:nil];
    


    [recognizer setTranslation:CGPointMake(0, 0) inView:_myScroll];


我不会在这里给你完美的答案,你必须在代码上工作才能找到一种方法让它按照你的意愿工作。

这是最后一个提示。您可以使用 slideFactor 来制作某种“平滑”动画。它将帮助您的动画更加“逼真”。处理这段代码,你在“if”的开头添加:

CGPoint velocity = [recognizer velocityInView:self.view];
CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y));
CGFloat slideMult = magnitude / 200;

float slideFactor = 0.1 * slideMult; // Increase for more slide

然后在 UIView animateWithDuration: 中,使用slideFactor 作为持续时间。

【讨论】:

以上是关于UIGestureRecognizer 拖拽 UIView的主要内容,如果未能解决你的问题,请参考以下文章

有时在 UIGestureRecognizer 处理程序后未触发 IBAction

UIGestureRecognizer

如何将 UIGestureRecognizer 限制为特定的 UIView?

unity UGUI怎么让 被拖拽的UI最后渲染

unity--拖拽(UI-Image Sprite Render)

UI组件之浮出层的拖拽