UIPanGesture跟随手势滑动View

记录一个平常很常见的代码段,某些弹窗需要可以跟随手势滑动拖拽

#import "TestDragPanView.h"

@implementation TestDragPanView

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panMoved:)];
        pan.minimumNumberOfTouches = 1;
        pan.maximumNumberOfTouches = 1;
        [self addGestureRecognizer:pan];
    }
    return self;
}
- (void)panMoved:(UIPanGestureRecognizer *)panGesture {
    if (panGesture.state == UIGestureRecognizerStateEnded
        || panGesture.state == UIGestureRecognizerStateCancelled
        || panGesture.state == UIGestureRecognizerStateFailed) {
        // 当停止移动时,设置自动移动到边侧
        // 一般panGesture.view 等同于self
        UIView *gestureView = panGesture.view;
        CGFloat autoMinX = 50;
        CGFloat autoMaxX = UIScreen.mainScreen.bounds.size.width - gestureView.frame.size.width - 50;
        CGFloat originX = gestureView.frame.origin.x;
        if (originX < autoMinX) {
            // 当停下来时,x超过一定的数据,自动靠到左边
            CGFloat fix = 0;
            gestureView.frame = CGRectMake(fix, gestureView.frame.origin.y, gestureView.frame.size.width, gestureView.frame.size.height);
        }else if (gestureView.frame.origin.x > autoMaxX) {
            // 当停下来时,x超过一定的数据,自动靠到右边
            CGFloat fix = UIScreen.mainScreen.bounds.size.width - gestureView.frame.size.width;
            gestureView.frame = CGRectMake(fix, gestureView.frame.origin.y, gestureView.frame.size.width, gestureView.frame.size.height);
        }
        
    }else if(panGesture.state == UIGestureRecognizerStateChanged) {
        // 一般panGesture.view 等同于self
        UIView *gestureView = panGesture.view;
        // 获取到手指移动的距离
        CGPoint translation = [panGesture translationInView:gestureView.superview];
        // 限定centerX的最大最小值
        CGFloat minCenterX = gestureView.bounds.size.width/2;
        CGFloat maxCenterX = UIScreen.mainScreen.bounds.size.width - gestureView.bounds.size.width/2;
        CGFloat centerX = gestureView.center.x + translation.x;
        centerX = MAX(minCenterX, centerX);
        centerX = MIN(maxCenterX, centerX);
        // 限定centerY的最大最小值
        CGFloat minCenterY = gestureView.bounds.size.height/2;
        CGFloat maxCenterY = UIScreen.mainScreen.bounds.size.height - gestureView.bounds.size.height/2;
        CGFloat centerY = gestureView.center.y + translation.y;
        centerY = MAX(minCenterY, centerY);
        centerY = MIN(maxCenterY, centerY);
        // 设置最新center,实现view跟随view移动
        gestureView.center = CGPointMake(centerX, centerY);
        // 将手势移动的距离恢复成0,这样可以在下次读取移动距离时比较简单
        [panGesture setTranslation:CGPointZero inView:gestureView.superview];
    }
     
}

@end
oytwy-ssmbh (1).gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,118评论 2 59
  • ![Flask](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAW...
    极客学院Wiki阅读 7,854评论 0 3
  • 不知不觉易趣客已经在路上走了快一年了,感觉也该让更多朋友认识知道易趣客,所以就谢了这篇简介,已做创业记事。 易趣客...
    Physher阅读 3,841评论 1 2
  • 双胎妊娠有家族遗传倾向,随母系遗传。有研究表明,如果孕妇本人是双胎之一,她生双胎的机率为1/58;若孕妇的父亲或母...
    邺水芙蓉hibiscus阅读 3,937评论 0 2
  • 晴天,拥抱阳光,拥抱你。雨天,想念雨滴,想念你。 我可以喜欢你吗可以啊 我还可以喜欢你吗可以,可是你要知道我们不可...
    露薇霜凝阅读 1,367评论 1 2

友情链接更多精彩内容