正确使用|正确使用 iOS 开发中的六大操作手势
【正确使用|正确使用 iOS 开发中的六大操作手势】在 iOS 的开发过程中,我们一般使用 touches 方法来监听 view 的触摸事件,但是这样使用会有一些弊端:
- 必须得自定义 view, 在自定义的 View 当中去实现 touches 方法
- 由于是在 view 内部的 touches 方法中监听触摸事件,因此默认情况下,无法让其他外界对象监听 view 的触摸事件
- 不容易区分用户具体的手势行为
UIGestureRecognizer 手势识别器
- 利用 UIGestureRecognizer,能轻松识别用户在某个 view 上面做的一些常见手势
- UIGestureRecognizer 是一个抽象类,定义了所有手势的基本行为,使用它的子类才能处理具体的手势
- 点按手势
UITapGestureRecognizer
- 长按手势
UILongPressGestureRecognizer
- 平移(拖拽)手势
UIPanGestureRecognizer
- 轻扫手势
UISwipeGestureRecognizer
- 旋转手势
UIRotationGestureRecognizer
- 捏合手势
UIPinchGestureRecognizer
- 点按手势
- 手势的使用方法
- 创建手势
- 添加手势
- 实现手势方法
- 补充(手势也可以设置代理)
文章图片
点按手势效果图
- (void)topGes {
//创建点按手势
UITapGestureRecognizer *tapGes = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap)];
//手势也可以设置代理
tapGes.delegate = self;
//添加手势
[self.imageView addGestureRecognizer:tapGes];
}- (void)tap {
NSLog(@"现在是点按手势");
}
- 实现代理方法
//代理方法:是否允许接收手指
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
//让图片左边可以点击,右边不能点击
//获取当前手指所在的点进行判断
CGPoint curP = [touch locationInView:self.imageView];
if (curP.x > self.imageView.bounds.size.width * 0.5) {
return NO;
}else {
return YES;
}
}
2. UILongPressGestureRecognizer 长按手势
文章图片
长按手势效果图
- (void)longPGes {
UILongPressGestureRecognizer *longPGes = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longP:)];
[self.imageView addGestureRecognizer:longPGes];
}//当长按并移动时,会多次调用这个方法
- (void)longP:(UILongPressGestureRecognizer *)longP {
//判断长按时的状态
if (longP.state == UIGestureRecognizerStateBegan) {
NSLog(@"开始长按");
}else if (longP.state == UIGestureRecognizerStateChanged) {
NSLog(@"- - - 长按时手指移动了 - - -");
}else if (longP.state == UIGestureRecognizerStateEnded) {
NSLog(@"长按结束");
}
}
3. UIPanGestureRecognizer 平移(拖拽)手势 平移(拖拽)手势效果图
- (void)panGes {
UIPanGestureRecognizer *panGes = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
[self.imageView addGestureRecognizer:panGes];
}- (void)pan:(UIPanGestureRecognizer *)pan {
//获取偏移量
CGPoint transP = [pan translationInView:self.imageView];
NSLog(@"transP = %@", NSStringFromCGPoint(transP));
//移动图片
self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, transP.x, transP.y);
//清零,不要累加
[pan setTranslation:CGPointZero inView:self.imageView];
}
4. UISwipeGestureRecognizer 轻扫手势
文章图片
轻扫手势效果图
- 一个手势只能对应一个方向,若要支持多个方向,可以添加多个手势
- 轻扫手势的方向默认是向右
- 可以通过修改手势的 direction 属性修改手势的方向
- (void)swipeGes {
//一个手势只能对应一个方向,若要支持多个方向,可以添加多个手势
UISwipeGestureRecognizer *swipeGes1 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
//轻扫手势的方向默认是向右
[self.imageView addGestureRecognizer:swipeGes1];
UISwipeGestureRecognizer *swipeGes2 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
//可以修改手势的方向,向上
swipeGes2.direction = UISwipeGestureRecognizerDirectionUp;
[self.imageView addGestureRecognizer:swipeGes2];
UISwipeGestureRecognizer *swipeGes3 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
//手势的方向,向左
swipeGes3.direction =UISwipeGestureRecognizerDirectionLeft;
[self.imageView addGestureRecognizer:swipeGes3];
UISwipeGestureRecognizer *swipeGes4 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
//手势的方向,向下
swipeGes4.direction = UISwipeGestureRecognizerDirectionDown;
[self.imageView addGestureRecognizer:swipeGes4];
}- (void)swipe:(UISwipeGestureRecognizer *)swipe {
if (swipe.direction == UISwipeGestureRecognizerDirectionLeft) {
NSLog(@"向左轻扫 --- left");
}else if (swipe.direction == UISwipeGestureRecognizerDirectionRight){
NSLog(@"向右轻扫 --- right");
}else if (swipe.direction == UISwipeGestureRecognizerDirectionUp){
NSLog(@"向上轻扫 --- up");
} else if (swipe.direction == UISwipeGestureRecognizerDirectionDown) {
NSLog(@"向下轻扫 --- down");
}
}
5. UIRotationGestureRecognizer 旋转手势 旋转手势效果图
- (void)rotationGes {
UIRotationGestureRecognizer *rotationGes = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotation:)];
[self.imageView addGestureRecognizer:rotationGes];
}- (void)rotation:(UIRotationGestureRecognizer *)rotationGes {
//获取旋转的度数
CGFloat angle = rotationGes.rotation;
//旋转图片
self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, angle);
//清零
[rotationGes setRotation:0];
}
6. UIPinchGestureRecognizer 捏合手势 捏合手势效果图
- (void)pinchGes {
UIPinchGestureRecognizer *pinchGes = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
[self.imageView addGestureRecognizer:pinchGes];
}- (void)pinch:(UIPinchGestureRecognizer *)pinchGes {
//获取缩放比例
CGFloat scale = pinchGes.scale;
NSLog(@"scale = %f", scale);
//缩放图片
self.imageView.transform = CGAffineTransformScale(self.imageView.transform, scale, scale);
//初始化大小
[pinchGes setScale:1];
}
补充:手势的混合使用
- 默认情况下只能同时支持一种手势
- 若要同时支持多种手势,可以给要支持的手势设置代理,并实现以下代理方法
//是否允许同时支持多个手势
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizershouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {return YES;
}
旋转与捏合混合手势使用效果图
至此,iOS 开发中的 6 种手势操作已经介绍完毕了,大家可以通过设置多种手势混合使用来达到一定的效果,希望大家都能更上一层楼!
推荐阅读
- 电气元件的使用|降压模块的使用
- STM32的使用|STM32F4软件IIC的使用
- spdk(一)----为什么要使用spdk()
- 使用切片|使用切片,注解, 打印日志
- 前端学习笔记|5.0 Vue中使用webpack
- Python|Python xpath,JsonPath,bs4的基本使用
- python|python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例
- 前端数据加密CryptoJs使用
- Arduino|Part5 -- 如何使用Arduino的IIC总线(Wire)
- docker|使用docker安装mysql