当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/225404.html

相关文章:

  • 多级缓存之实现多级缓存
  • React【axios、全局处理、 antd UI库、更改主题、使用css module的情况下修改第三方库的样式、支持sass less】(十三)
  • 在gitlab中指定自定义 CI/CD 配置文件
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • 浅谈设计模式
  • 企业年会/年终活动如何邀请媒体记者报道?
  • C语言如何执行HTTP GET请求
  • .Net 6 Nacos日志控制台疯狂发输出+Log4Net日志过滤
  • Libra R-CNN: Towards Balanced Learning for Object Detection(2019.4)
  • Redis的内存淘汰策略分析
  • git命令之遭遇 ignore罕见问题解决
  • torch DDP多卡训练教程记录
  • Jenkins CICD过程常见异常
  • Java11新增特性
  • 安卓常见设计模式13------过滤器模式(Kotlin版)
  • 使用spark进行递归的可行方案
  • Spring -Spring之依赖注入源码解析(下)--实践(流程图)
  • 前端设计模式之【单例模式】
  • 设备零部件更换ar远程指导系统加强培训效果
  • 文本生成高精准3D模型,北京智源AI研究院等出品—3D-GPT
  • Netty入门指南之NIO 网络编程
  • LeetCode(6)轮转数组【数组/字符串】【中等】
  • 华为云Ascend310服务器使用
  • 【poi导出excel模板——通过建造者模式+策略模式+函数式接口实现】
  • 自适应模糊PID控制器在热交换器温度控制中的应用
  • 【系统救援】 Ubuntu重启失败,报错:UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY
  • 【数据结构】树与二叉树(八):二叉树的中序遍历(非递归算法NIO)
  • 第九章 排序【数据结构】【精致版】
  • 基于element-plus定义表格行内编辑配置化
  • WebGL-Vue3-TS-Threejs:基础练习 / Javascript 3D library / demo