首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用UIPanGestureRecognizer设置拖动控件的边界?

使用UIPanGestureRecognizer设置拖动控件的边界可以通过以下步骤实现:

  1. 创建一个UIPanGestureRecognizer对象,并将其添加到需要拖动的控件上。
  2. 在拖动手势的回调方法中,获取手势的位置信息和变化量。
  3. 根据变化量更新控件的位置,可以使用控件的frame属性或transform属性进行位置的调整。
  4. 在更新位置之前,判断控件是否超出了边界。可以通过比较控件的位置和边界的大小来判断是否超出。
  5. 如果控件超出了边界,可以将控件的位置调整到边界的位置,或者限制控件的移动范围。
  6. 根据需要,可以添加动画效果来平滑地移动控件。

以下是一个示例代码,演示如何使用UIPanGestureRecognizer设置拖动控件的边界:

代码语言:txt
复制
import UIKit

class ViewController: UIViewController {
    var draggableView: UIView!
    var panGestureRecognizer: UIPanGestureRecognizer!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 创建可拖动的视图
        draggableView = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
        draggableView.backgroundColor = UIColor.red
        view.addSubview(draggableView)
        
        // 创建拖动手势识别器
        panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
        draggableView.addGestureRecognizer(panGestureRecognizer)
    }
    
    @objc func handlePan(_ gestureRecognizer: UIPanGestureRecognizer) {
        let translation = gestureRecognizer.translation(in: view)
        
        // 更新视图位置
        var newX = draggableView.center.x + translation.x
        var newY = draggableView.center.y + translation.y
        
        // 判断是否超出边界
        let minX = draggableView.bounds.width / 2
        let minY = draggableView.bounds.height / 2
        let maxX = view.bounds.width - draggableView.bounds.width / 2
        let maxY = view.bounds.height - draggableView.bounds.height / 2
        
        newX = max(minX, min(newX, maxX))
        newY = max(minY, min(newY, maxY))
        
        draggableView.center = CGPoint(x: newX, y: newY)
        
        gestureRecognizer.setTranslation(CGPoint.zero, in: view)
    }
}

这个示例代码创建了一个可拖动的红色视图,并使用UIPanGestureRecognizer来实现拖动功能。在拖动手势的回调方法中,通过比较视图的位置和边界的大小,限制了视图的移动范围,确保视图不会超出边界。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android如何创建可拖动图片控件

本文实例为大家分享了Android创建可拖动图片控件具体代码,供大家参考,具体内容如下 重载、自绘 1、从View派生一个控件类 ,构造函数中调用父类构造器。...(和windowsMFC有种似曾相识感觉,可能安卓借鉴了windows模式吧) 消息处理 拖动图片消息,主要是处理按下和移动两个消息,重载onTouchEvent。...数学知识(平移):在ACTION_DOWN时记录下坐标点,在ACTION_MOVE时根据当前位置与按下时位置算出平移量。刷新控件,导致控件重绘,重绘时移动绘制左上角坐标即可。...android:layout_width="fill_parent" android:layout_height="fill_parent" / </LinearLayout 控件自绘代码...以上就是本文全部内容,希望对大家学习有所帮助。

2.1K20
  • iOS开发之手势识别

    下面会先给出如何用storyboard给相应控件添加手势,然后在用纯代码方式给我们控件添加手势,手势用法比较简单。和button用法类似,也是目标动作回调,话不多说,切入今天正题。...不过用storyboard可以减少我们工作量,这两个要配合着使用才能大大提高我们开发效率。...个人感觉用storyboard把框架搭起来(Controller间关系),一下小东西还是用纯代码敲出来更好一些。下面就给出如何给我们控件用纯代码方式来添加手势识别。     ...(PanGestureRecognizer)       拖动手势初始化 1 //添加拖动手势 2 UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer...(通过translationInView获取移动点,和TouchesMoved方法类似) 1 //拖动手势 2 -(void) panGesture:(id)sender 3 { 4 UIPanGestureRecognizer

    2.6K90

    iOS初来乍到,你如何开始第一个封装类?

    我们经常用到三方控件,无一例外都是封装好。要想快速学习,有一个途径就是看别人封装源码。封装好才类使用起来很爽,很傻瓜易用。在此感谢那些无私开源的人,给我们很多学习机会。...说到这不得不提“面向对象”这个术语了,简单理解封装好模块就是一个对象,你使用这个模块就在面向对象编程。面向对象,是一种编程思想。 下面我以一个小控件为例,在封装过程中逐步讲解。...底层是一个view,我们可以创建一个类继承UIView,然后在上面加控件。怎么做想好了,那我们需要公开哪些属性、方法供外界修改、使用呢?...我大致说下:最开始我们限制了拖动距离,上面的 1 呢是为了留滑块与底层间隙,我们获取停止拖动时机,进行一个很重要判断,当拖动距离大于一半时候我们就让滑块滑动到最终位置,反之则回到最初位置(这里其实是一个用户体验问题...注:这个博客只要想表达如何开始封装,因此没有做layerSubViews方法,以及awakeNib,所以就不支持约束和旋转拉。 总结:一个好封装控件要做到高内聚、低耦合。

    1.2K40

    【IOS开发进阶系列】手势专题

    每个手势只对应一个View,当屏幕触摸在View边界内时,如果手势和预定一样,那就会回调方法。         ...放了一条蛇图片,在模拟器上拖动是没问题。...运行效果如下: 2.6 拖动(pan手势)速度(以较快速度拖放后view有滑行效果) 如何实现呢?...如果速度向量小于200,那就会得到一个小于小数,那么滑行会很短;     基于速度和速度因素计算一个终点;     确保终点不会跑出父View边界;     使用UIView动画使view滑动到终点...不过这个点击播放声音有点缺陷,就是在慢慢拖动时候也会播放。这使得两个手势重合了。怎么解决呢?使用手势:requireGestureRecognizerToFail方法。

    47540

    UIScrollView

    ,然后再返回一个布尔值 @property(nonatomic) BOOL bounces; //11.如果这个属性被设置成YES而且bounces值是YES,垂直拖动是允许内容,即使小鱼滚动视图边界...如果它从这种方法受到NO便停止拖动和转发触摸时间内容子视图。...@property(nonatomic) BOOL scrollsToTop; //39.拖动手势(只读) @property(nonatomic, readonly) UIPanGestureRecognizer...代理方法:方法名一般是控件名开头,比如UIScrollView代理方法一般以scrollView开头 如何监听控件行为 通过addTarget: 只有继承自UIControl控件,才有这个功能...,才有这个功能 NSTimer使用 开启定时器 @property (nonatomic, weak) NSTimer *timer; // 返回一个自动开始执行任务定时器 self.timer

    1.8K60

    iOS中手势应用1. 四类事件主要方法2. 响应者链3. 手势识别功能(Gesture Recognizer)4. 手势使用

    最终找到这个干活控件,我们学术上就叫做第一响应者对象。找到了负责处理按钮之后如何给出相应处理呢?大概过程就是这样: button尝试处理事件。如果它不能处理事件,则将事件传递给其父视图。...,定义了所有手势基本行为,使用子类才能处理具体手势 UITapGestureRecognizer(点按) UIPinchGestureRecognizer(捏合,用于缩放) UIPanGestureRecognizer...手势识别的使用方法 1.创建手势识别实例 2.设置手势识别属性,例如手指数量,方向等 3.将手势识别附加到指定视图之上 4.编写手势触发监听方法 每一个手势识别器用法都差不多,比如UITapGestureRecognizer...使用步骤如下: //创建手势识别器对象 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init]; //设置手势识别器对象具体属性...- (void)addPanGesture { //创建拖动手势 并添加手势监听事件 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer

    2.3K40

    ios 百度地图 获取拖动或缩放手势

    在项目中遇到一个问题,在拖动或者缩放百度地图时候要请求数据。但是百度地图SDK中没有明确如何获取拖动和缩放手势 官方推荐使用如下两个方法,通过判断状态来获取,但是也没有明确怎么判断。...还有个问题就是如果在regionDidChangeAnimated请求数据的话,产品还有个需百度地图中心点以最新一条数据经纬度移动。...animated 是否动画 */ - (void)mapView:(BMKMapView *)mapView regionDidChangeAnimated:(BOOL)animated; 这里推荐使用自定义手势来判断...注意:加自定义手势时,必须设置UIGestureRecognizer属性cancelsTouchesInView 和 delaysTouchesEnded 为NO,否则影响地图内部手势处理。...// 拖动 UIPanGestureRecognizer *mapPanGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self

    1.5K30

    Cobub无码埋点关键技术实现流程(附图)

    本文主要介绍无码埋点技术实现。 无码埋点实现流程 1.可视化视图圈选,在页面上会出现浮动圆圈,拖动圆圈至想配置事件控件上,将会弹出输入事件弹框。...实现流程中技术点 可视化视图圈选实现 自定义UIWindow子类,当做悬浮小圆圈,添加UIPanGestureRecognizer手势,根据手势位移,设置悬浮框位移。...圈选视图绑定事件 视图唯一标识viewPath生成,上述步骤已经拿到了圈选视图。如何确定视图viewPath也是重点。viewPath需要整个应用唯一,才可以区别不同事件。...计算节点index,这个步骤,有种特殊视图需要注意,可复用视图index是跟数据源相关,比如UITableViewCell,此类视图index不能使用父视图subviews下标代替,应该使用数据源下标代表...如何检测用户触发了绑定了事件ID视图也是重点,此处运用核心技术是runtime中Method Swizzle。下面介绍一下针对不同类型控件如何hook相应方法。 1.

    1.4K60

    iOS - 实现UINavigation全屏滑动返回(二)

    先来看下系统手势有没有提供属性或方法供我们使用 NSLog(@"%@", self.interactivePopGestureRecognizer); 打印信息: /* <UIScreenEdgePanGestureRecognizer...既然没有提供方式给我们现实要求,那我们就自己添加一个拖动手势 UIPanGestureRecognizer来替它执行滑动返回功能。...handleNavigationTransition:)]; [self.view addGestureRecognizer:pan]; 添加一个拖动手势,让他执行系统手势操作,调用handleNavigationTransition...,而UIPanGestureRecognizer又继承于UIGestureRecognizer,在UIGestureRecognizer提供方法中我们可以推断出一定有target,而且还是强引用私有属性...(pan)]; [self.view addGestureRecognizer:myPan]; myPan.delegate = self; 我们在添加手势时设置了target为self,而delegate

    1.3K40

    UIGestureRecognizer  手势识别一、概念介绍二、UIView 分类三、UIGestureRecognizer 抽象类四、UIGestureRecognizerDelegate 代理

    UIPinchGestureRecognizer(捏合手势,缩放用) 使用步骤: (1)创建手势识别对象 (2)设置手势识别属性,例如手指数量,方向等 (3)将手势识别附加到指定视图之上...touchesCancelled给触摸到控件以取消控件view对touch响应,这个时候只有手势识别器响应touch,当设置成NO时,手势识别器识别到触摸之后不会发送touchesCancelled...如果设置为YES,手势识别器在识别的过程中(注意是识别过程),不会将触摸发给触摸到控件,即控件不会有任何触摸事件。...: 1、 开始进行手势识别时调用方法,返回NO则结束识别,不再触发手势,用处:可以在控件指定位置使用手势识别 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer...0位置.recognizer.rotation = 0; } 九、UIPanGestureRecognizer(拖拽手势) 1、设置触发拖拽最少手指数,默认为1 @property (nonatomic

    3K81

    iOS好用第三方侧边栏控件——MMDrawerController

    iOS好用第三方侧边栏控件——MMDrawerController 一、引言         很多应用程序都采用了侧边栏这样界面结构,MMDrawerController是一个轻量级侧边栏抽屉控件...二、MMDrawerController使用及相关设置         MMDrawerController使用十分简单,只需将中心视图控制器和左边栏视图控制器传入初始化方法即可完成MMDrawerController..., assign) CGFloat animationVelocity; //设置是否允许回弹效果,如果设置为YES,当使用手势进行侧边栏开启时会出现回弹效果 @property (nonatomic...如果要重写 必须调用父类此方法 -(void)panGestureCallback:(UIPanGestureRecognizer *)panGesture __attribute((objc_requires_super...,这个类中封装好了许多动画效果,开发者可以直接使用,示例如下: //使用提供动画模板 [rootController setDrawerVisualStateBlock:[MMDrawerVisualState

    2.8K20

    python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例

    PyQt5动态(可拖动控件大小)布局控件QSplitter简介 PyQt还提供了特殊布局管理器QSplitter。...它可以动态地拖动控件之间边界,算是一个动态布局管理器,QSplitter允许用户拖动控件边界控制子控件大小,并提供一个处理拖曳子控件控制器 在QSplitter对象中各子控件默认是横向布局...,可以使用Qt,Vertical进行垂直布局 QSplitter类中常用方法 方法 描述 addWidget() 将小控件添加到QSplitter管理器布局中 indexOf() 返回小控件在QSplitter...:垂直方向 setSizes() 设置控件初始大小 count() 返回小控件在QSplitter管理器中数量 QSplitter使用实例 import sys from PyQt5.QtWidgets...)布局控件QSplitter详细使用方法与实例,更多关于PyQt5布局控件使用知识请查看下面的相关链接

    4K41
    领券