概述
在何种无实体键盘的操作设备上都是通过在屏幕上的操作来完成各种想要的效果,包括iOS设备和Android设备以及其他各种操作系统的设备。所以理解并用好手势以及各种手势事件是十分十分重要的。
手势的分类
单个手指
- 点击
- 双击
- 长按
- 拖拽
两个手指
- 捏合(两个手指之间距离变化)
- 旋转 (两个手指连接成的直线在屏幕中旋转)
接下来将手势部分拆分成4篇文章。下面是第一篇
主要的点
- 手指从接触屏幕到离开屏幕经历了哪些阶段以及iOS系统中各个阶段的回调函数;
- 拖动;
- 主要涉及的类UITouch
涉及的类
我们的视图控制器中已经集成了和用户进行交互的手势功能,我们只需要实现这些函数监听来完成我们想要的操作,我们的视图控制器继承自UIViewController而UIViewController又继承自UIResponder,UIResponder中有各种手势处理的基础函数。
- UIViewController
- UIResponder
- UITouch(触碰类)
- UIEvent (触碰事件类)
示例
为了更好的理解,在屏幕中添加一张图片,然后随着手指在屏幕上的滑动而跟随滑动。以整个ViewController为触摸对象。
仔细看代码中注释
先看图
示例代码
我们的图片放置如下:新建图片集合,将切好的各种尺寸的图拖入各个位置就可以了。
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
{
//点对象声明
CGPoint _cgLastPt;
}
@end
ViewController.m
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//将一张图片添加到屏幕中
NSString* str = [NSString stringWithFormat:@"Image1.jpg"];
UIImage* image = [UIImage imageNamed:str];
UIImageView* iv = [UIImageView new];
iv.image = image;
iv.frame = CGRectMake(20, 20, 100, 200);
iv.tag = 101;
[self.view addSubview:iv];
}
//从手指接触屏幕到离开屏幕,系统帮我们判断好了我们的动作分为以下几种情况
//和Android以及Flutter思想是一样的,手势分类也基本一样。同时手势都封装成了event(事务)
//手指接触屏幕
-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSLog(@"touchesBegan");
//触碰对象
UITouch* touch = [touches anyObject];
//获取触碰(点击)次数tapCount
if (touch.tapCount == 1) {
NSLog(@"single tap");
}else if(touch.tapCount == 2){
NSLog(@"double tap");
}
//开始滑动的时候赋初始值
_cgLastPt = [touch locationInView:self.view];
}
//手指在屏幕上滑动,可以获取拖拽的距离等信息
-(void) touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//NSLog(@"touchesMoved");
UITouch* touch = [touches anyObject];
//获取触碰点对象
//相对于当前视图的坐标(self.view)
CGPoint pt = [touch locationInView:self.view];
//NSLog(@"x=%f,y=%f",pt.x,pt.y);
//计算偏移量
float xOffset = pt.x - _cgLastPt.x;
float yOffset = pt.y - _cgLastPt.y;
_cgLastPt = pt;
//根据接触点的坐标来调整图片位置,实现图片的拖拽效果
UIImageView* iv = [self.view viewWithTag:101];
//变换图片位置参数
//iv.frame.origin.x+xOffset:坐标值是以上一次滑动终点为基础加上本次滑动的偏移量
iv.frame = CGRectMake(iv.frame.origin.x+xOffset, iv.frame.origin.y+yOffset, iv.frame.size.width, iv.frame.size.height);
}
//手指离开屏幕
-(void) touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//NSLog(@"touchesEnded");
}
//因特殊情况下中断手势
//例如滑动的过程中突然来电话了
-(void) touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//NSLog(@"touchesCancelled");
}
@end