OC 实现手指滑动拖动View

RPReplay_Final1699613924

实现手指滑动拖动View

支持手势移动的控件 支持 Masonry frame 布局 使用富文本 也支持自动高度

核心代码
- (void)handlePanGesture:(UIPanGestureRecognizer *)p {
    CGPoint panPoint = [p locationInView:self.view];
    CGPoint currentViewPoint = _dragView.center;

    if (p.state == UIGestureRecognizerStateBegan) {
        _originalPoint = panPoint;
    } else if(p.state == UIGestureRecognizerStateChanged) {


        CGFloat moveCenterY = panPoint.y - _originalPoint.y;
        CGFloat moveCenterX = panPoint.x - _originalPoint.x;
        
        _moveY += moveCenterY;
        _moveX += moveCenterX;
        
        [self.dragView mas_updateConstraints:^(MASConstraintMaker *make) {
            make.centerY.mas_equalTo(self.view.mas_centerY).offset(_moveY);
            make.centerX.mas_equalTo(self.view.mas_centerX).offset(_moveX);
        }];
        //使用 frame 的话 这样布局
        //self.forecastGroupView.center = CGPointMake(currentViewPoint.x + moveCenterX, currentViewPoint.y + moveCenterY);
        _originalPoint = panPoint;

    } else if (p.state == UIGestureRecognizerStateEnded
             || p.state == UIGestureRecognizerStateCancelled) {
        
        CGFloat groupViewHeight = _dragView.frame.size.height;
        CGFloat groupViewWidth = _dragView.frame.size.width;
        CGFloat parentViewHeight = self.view.frame.size.height;
        CGFloat parentViewWidth = self.view.frame.size.width;
        

        CGFloat centerY = 0.0;
        BOOL edit = NO;
        
        if (currentViewPoint.y < groupViewHeight/2) {
            centerY = groupViewHeight/2;
            _moveY = -(parentViewHeight - groupViewHeight)/2;
            edit = YES;
        } else if (currentViewPoint.y > parentViewHeight - groupViewHeight/2) {
            _moveY = centerY;
            _moveY = (parentViewHeight - groupViewHeight)/2;
            edit = YES;
        } else {
            centerY = currentViewPoint.y;
        }

        
        CGFloat centerX = 0.0;
        if (currentViewPoint.x < groupViewWidth/2) {
            centerX = groupViewWidth/2;
            _moveX = -(KWidth - groupViewWidth)/2;
            edit = YES;
        } else if (currentViewPoint.x > parentViewWidth - groupViewWidth/2) {
            centerX = parentViewWidth - groupViewWidth/2;
            _moveX = (KWidth - groupViewWidth)/2;
            edit = YES;
        } else {
            centerX = currentViewPoint.x;
        }

        if(edit) {
            WeakSelf
            [UIView animateWithDuration:.25 animations:^{
                //使用 frame 的话 这样布局
                //self.forecastGroupView.center = CGPointMake(centerX, centerY);
                [weakSelf.dragView mas_updateConstraints:^(MASConstraintMaker *make) {
                    make.centerY.mas_equalTo(self.view.mas_centerY).offset(self->_moveY);
                    make.centerX.mas_equalTo(self.view.mas_centerX).offset(self->_moveX);
                }];
                
            } completion:^(BOOL finished) {}];
        }
        
    } else {
        NSLog(@" pan state : %zd", p.state);
    }
}

连接

UI交互 dome: iOS OC 部分UI交互 dome - Gitee.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值