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

调用UIPinchGestureRecognizer后更改UIView的界限

UIPinchGestureRecognizer 是 iOS 开发中用于识别捏合手势(即两个手指进行放大或缩小操作)的手势识别器。当用户对屏幕上的某个 UIView 进行捏合操作时,UIPinchGestureRecognizer 会被触发,并且可以通过它来获取捏合的比例因子(scale factor),从而可以相应地调整 UIView 的大小。

基础概念

  • 手势识别器(GestureRecognizer):这是 iOS 中的一个类,用于识别用户在屏幕上的各种手势操作。
  • 捏合手势(Pinch Gesture):用户使用两个手指在屏幕上进行的放大或缩小操作。
  • 界限(Bounds):UIView 的界限定义了视图在其坐标系统中的位置和大小。

相关优势

  • 用户交互:通过捏合手势,用户可以直观地缩放视图内容,提高用户体验。
  • 灵活性:开发者可以根据捏合的比例因子动态调整视图的大小,使得应用更加灵活和适应性强。

类型

  • UIPinchGestureRecognizer:专门用于识别捏合手势的手势识别器。

应用场景

  • 图片查看器:用户可以通过捏合手势来放大或缩小图片。
  • 地图应用:用户可以缩放地图以查看不同级别的细节。
  • 绘图应用:用户可以缩放画布以便更精细地编辑绘图。

实现步骤

  1. 创建 UIPinchGestureRecognizer 实例并将其添加到 UIView 上。
  2. 实现手势识别器的回调方法,在该方法中根据捏合的比例因子调整 UIView 的界限。

示例代码

代码语言:txt
复制
import UIKit

class ViewController: UIViewController {
    
    var pinchGesture: UIPinchGestureRecognizer!
    var myView: UIView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 初始化 UIView
        myView = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
        myView.backgroundColor = .blue
        view.addSubview(myView)
        
        // 初始化 UIPinchGestureRecognizer 并添加到 UIView
        pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(_:)))
        myView.addGestureRecognizer(pinchGesture)
        myView.isUserInteractionEnabled = true
    }
    
    @objc func handlePinch(_ gesture: UIPinchGestureRecognizer) {
        // 根据捏合的比例因子调整 UIView 的大小
        let scale = gesture.scale
        myView.transform = CGAffineTransform(scaleX: scale, y: scale)
        
        // 重置比例因子,以便下次手势识别时能够正确计算
        gesture.scale = 1.0
    }
}

可能遇到的问题及解决方法

问题:UIView 在缩放时位置发生了偏移。

原因:使用 CGAffineTransform 进行缩放时,默认是以 UIView 的中心点为基准进行缩放的。如果 UIView 的初始位置不是以中心点对齐,缩放时可能会出现位置偏移。

解决方法:可以通过调整 UIView 的 center 属性来确保缩放时以中心点为基准,或者在应用 CGAffineTransform 之前先调整 UIView 的 frame。

代码语言:txt
复制
@objc func handlePinch(_ gesture: UIPinchGestureRecognizer) {
    let scale = gesture.scale
    let currentTransform = myView.transform
    let newTransform = currentTransform.scaledBy(x: scale, y: scale)
    myView.transform = newTransform
    
    // 保持缩放中心不变
    let center = CGPoint(x: myView.bounds.midX, y: myView.bounds.midY)
    myView.center = center
    
    gesture.scale = 1.0
}

通过上述方法,可以确保 UIView 在缩放时保持正确的位置和大小。

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

相关·内容

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

- (CGPoint)locationInView:(nullable UIView*)view; 6、获取触摸手指数 - (NSUInteger)numberOfTouches; 7、多指触摸的触摸点相对于指定视图的位置...代理方法 处理一些同时进行的手势操作: 1、 开始进行手势识别时调用的方法,返回NO则结束识别,不再触发手势,用处:可以在控件指定的位置使用手势识别 - (BOOL)gestureRecognizerShouldBegin...调用gesture recognizer的touchesBegan:withEvent:方法之前调用,如果返回NO,则gesture recognizer不会看到此触摸事件。...= CGAffineTransformRotate(recognizer.view.transform, recognizer.rotation); // 每次旋转完毕后将rotation的值, 恢复到...每次平移手势识别完毕后, 让平移的值不要累加 [recognizer setTranslation:CGPointZero inView:recognizer.view]; } ---- 十、UIPinchGestureRecognizer

3.1K81

iOS14开发-触摸与手势识别

// 返回的位置是针对view的坐标系。 // 调用时传入的view参数为空的话,返回的是触摸点在整个窗口的位置 。 open func location(in view: UIView?)...UIWindow 接收到事件后,首先判断自己能否响应触摸事件。如果能,那么 UIWindow 会从后往前遍历自己的子 UIView,将事件向下传递。...-> Bool { } UIApplication 调用 UIWindow 的hitTest方法将触摸事件传递给 UIWindow,如果 UIWindow 能够响应触摸事件,则调用其子 UIView 的...使用步骤 创建手势实例,指定回调方法,当手势开始,改变、或结束时,回调方法被调用。 将手势添加到需要的 UIView 上。...每个手势只对应一个 UIView,当屏幕触摸在当前 UIView 里时,如果手势和预定的一样,回调方法就会调用。 手势可以通过 storyboard 或者纯代码使用。

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

    当创建手势时,指定一个回调方法,当手势开始,改变、或结束时,回调方法被调用。         添加到需要识别的View中。...运行效果如下: 2.6 拖动(pan手势)速度(以较快的速度拖放后view有滑行的效果) 如何实现呢?...如果速度向量小于200,那就会得到一个小于的小数,那么滑行会很短;     基于速度和速度因素计算一个终点;     确保终点不会跑出父View的边界;     使用UIView动画使view滑动到终点...;     运行后,快速拖动图像view放开会看到view还会在原来的方向滑行一段路。...4 开发技巧 4.1 要注意的问题 4.1.1 手势尽量不要全屏幕使用,以防截留其他事件         添加手势后,手势响应事件是第一响应者,所以稍不注意,就容易截掉其他事件的响应。

    51540

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

    UIView继承自UIResponder,因此所有的控件都是响应者对象 UIWindow:是特殊的UIView,所以也是响应者对象 UIApplication,所以也是响应者对象 1....一次完整的触摸事件的传递响应的过程大概是这样的: UIAppliction --> UIWindow -->递归找到最适合处理事件的控件-->控件调用touches方法-->判断是否实现touches方法...手势的使用 4.1 长按手势 长按手势一定要判断状态,否则方法会在手势开始和结束时分别调用!方法会被调用两次!...方法会被调用两次!...:pinch]; } //识别到 缩放(捏合)手势后回调的方法 - (void)pinch:(UIPinchGestureRecognizer *)recognizer { //绽放图片

    2.3K40

    CentOS挂载NAS存储后权限的更改

    上次用centos挂载HP共享存储后发现一个问题,默认挂载到本地后的目录属主和属组为当前挂载用户,而且无法更改,这里记录一下处理过程 1.umount已挂载的文件系统 umount /backup 2....取消共享存储的'根限制' 注:红圈里面的'根限制'要取消勾选,然后点击更新 3.重新挂载nfs文件系统 #这里注意,使用默认的挂载方式挂载后,nfs默认的文件系统版本为 nfs4,如下例子: [root...boot 10.1.1.133:/nas/nfs-ts nfs4 466G 4.0M 466G 1% /backup #这里挂载时指定nfs文件系统为 nfs3 即可解决无法修改挂载后目录无法修改属主和属组的问题...797M 13% /boot 10.1.1.133:/nas/nfs-ts nfs 466G 4.0M 466G 1% /backup 4.修改属主属组测试 #这里可以看到挂载后默认属主属组为当前挂载用户...:就算你用nfs3挂载的文件系统,那么依然无法修改属主属组,更为安全,如下图: #勾选了'根限制'后我们在来修改属主属组测试 [root@localhost ~]$ ls -l / total 73

    4.1K10

    iOS-控件响应用户控制事件之事件处理

    view的左上角为原点(0, 0)) 调用时传入的view参数为nil的话,返回的是触摸点在UIWindow的位置 - (CGPoint)previousLocationInView:(UIView *...,这也是整个事件处理过程的第一步 4.找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事件处理 touchesBegan… touchesMoved… touchedEnded… 如果父控件不能接收触摸事件...从后往前遍历子控件,重复前面的两个步骤 如果没有符合条件的子控件,那么就自己最适合处理 原理 // point:是方法调用者坐标系上的触摸点的位置 - (UIView *)hitTest:(CGPoint...2> 调用最合适控件的touches….方法 3> 如果调用了[super touches….]...是一个抽象类,定义了所有手势的基本行为,使用它的子类才能处理具体的手势 UITapGestureRecognizer(敲击) UIPinchGestureRecognizer(捏合,用于缩放) UIPanGestureRecognizer

    97670

    iOS_38_手势

    ,才干够接收和处理事件 父类响应者中定义的事件处理接口例如以下: 触摸事件处理的四个方法例如以下:(仅仅要实现,系统会自己主动调用) 一个UITouch对象,代表着一根手指,手指移动,...,经常使用的属性是:事件类型 触摸的四个方法(即过程)具体解释:注意同一时候和一前一后触摸的情况 必须先找到事件的最合适的响应者(从父到子地找) 以下是寻找最合适的事件响应者详细样例:...特殊情况:要尤其注意 找到了事件的最佳处理者之后,就是响应者链条了 默认是会调用其[super touchesXXX],这个super就是上一个响应者 即:官方文档中的next responder...(weak, nonatomic) IBOutlet UIView *nanaView; - (IBAction)dismiss; @end @implementation PanController...,就会调用监听方法) UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self

    93320

    如何修改网站备案 网站备案后的内容能否更改

    当创建的网站成功备案后,很多人会因为第一次网站备案,对网站内容填写的信息不满意,因此想要在备案之后重新修改网站备案,但是大多数已经备案成功的人,并不知道如何修改网站备案?...,那么得重新填写网站负责人的相关信息才能够修改,不过如果想要给网站增加新的域名,那么在网站其他域名的地方填写新的域名即可。...网站备案后的内容能否更改 原则上来说,网站备案的内容无法进行更改。...不过如果网站备案成功以后,那么网站上的内容是可以更改的,备案之后的网站,可以使用国内的空间,如此国内的用户打开网站的速度要大于其他的空间,所以网站创立之后,备案是十分重要的,一旦没有备案成功,那么网站就被会直接撤销...对于网站域名或者内容不满意的用户,可以在网站备案之后对其进行修改,或者在网站上交ICP备案信息后,可以把网站给服务商,让服务商帮助修改网站备案的内容,这样可以减少个人或企业网站备案的负担与压力,强化服务商的备案责任

    16.9K10

    如何解决WordPress更改新域名后无法访问的调试

    如何解决WordPress更改新域名后的安装调试,很多人在做了网站的搬家和网站的从新更换空间域名搬家之后,往往出现网站打不开的情况,这个问题其实并不难,但是很多新手站长因为不知道,导致在处理这类问题上花费了大量的时间...今天给大家分享一下如何使得更换域名后的网站如何正常运行(来源:wordpress建站吧) 方法一: 修改wp-config.php ,不是很推荐的方法 1、在wp-config.php中,添加以下两行内容...2、登录后台,在 “常规 -> 设置”重新配置新博客地址(HOME)和安装地址(SITEURL),成功后一定记得删除上面添加的内容,这个方法比较推荐。...修改wp-config.php(自动更新地址) 1、在wp-config.php中,添加下面一行内容: 试用 define(‘RELOCATE’,true); 方法四:修改数据库,这个是比较推荐的方法...1,登录到你的管理页面,找到 wp_options 表 2,将表中的 siteurl 和 home 字段修改为当前的新域名 注:以上4个方法都可完美解决WordPress更换域名后出现的访问问题,选择看个人喜好

    4K30

    神奇的traitlets(赋予PY类属性修改后,自动更改事件)

    最近在读一个英伟达库的代码,读到这个的使用法,研究了一下觉得很新奇。...---- 在我们学习py的第一天就是知道它是一个动态的语言,我相信很多人学了很久也不知道动态到底动在哪里,简单的说一下就是创建变量的时候,直接用一个名字和你目标量一连就好,你什么也不用管。...观察者模式,属性修改后,用自己的函数更改事件 如果前面的用法是毛毛雨的话,那这个就是瓢泼大雨了。在开始bb之前,我们说下什么是观察者模式。我不太喜欢书中的定义,太装A++(自己思考)。...): # change是我们在捕获到改动事件后做出的反应 if change['new'] and not change['old']: # transition...the notification, usually 'change' } { “所有者”:对象,#HasTraits实例 “new”:1,#新值 “old”:0,#旧值 “name”:“bar”,#更改特征的名称

    1.5K30
    领券