ios - UIGestureRecognizer 拖动 UIView

标签 ios uiview uigesturerecognizer

我正在尝试构建一个 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];

}

最佳答案

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

两个教程均来自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 作为持续时间。

关于ios - UIGestureRecognizer 拖动 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13879666/

相关文章:

ios - UICollectionView 旋转动画

ios - 神秘的 UIActivityIndi​​catorView 错误?

ios - UIStepper 值已更改。

ios - UICollectionView 手势事件

iphone - 是否可以在 iPhone 中重新创建用户手势?

ios - UITableView 在编辑时不显示左侧多选圆圈

iphone - 获取 UITableViewCell 内 View 的绝对位置

ios - 为什么具有便捷 init() 方法的 Swift UIView 子类在更新到 Swift 3.0 后会开始无限循环?

ios - 定时器上的 Objective C 加载图标

swift - tableView下添加TapGesture查看