touch事件
一个view是否可以处理触摸事件,是根据这个view类的内部是否实现了touch方法来决定的。
触摸事件的传递
当手指触摸到屏幕上的一个view时,系统内部会判断它是否可以处理这个触摸事件,如果能够处理,就自己处理,不在往下传递;如果自己处理不了,就往下传递,如果将要处理触摸事件的view 正好是视图控制器自带的view(self.view),那么就把这个事件交给视图控制器来处理。
主要涉及下面四个方法,之前我们也见过:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"began");
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"move");
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"end");
}
// 由于系统的原因,触摸事件被取消了,会调用这个方法
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"cancel");
}
手势
常用的手势有六种, 滑动pan 捏合pinch 旋转rotation 长按longpress 点击tap 轻扫swipe,来看一下我在自定义 view 中写的手势例子
- (id)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self){
// 6种手势
// 滑动pan 捏合pinch 旋转rotation 长按longpress 点击tap 轻扫swipe
// 创建手势识别器
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
// 手势要求最少几个手指
// panGesture.minimumNumberOfTouches = 2;
// 把手势识别器添加给view
[self addGestureRecognizer:panGesture];
// 捏合
UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
[self addGestureRecognizer:pinchGesture];
// 旋转
UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotation:)];
rotationGesture.delegate = self;
[self addGestureRecognizer:rotationGesture];
// 长按
UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
[self addGestureRecognizer:longPressGesture];
// tap
// UITapGestureRecognizer
}
return self;
}
- (void)pan:(UIPanGestureRecognizer *)recognizer{
CGPoint point = [recognizer translationInView:[self superview]];
NSLog(@"pan %@",NSStringFromCGPoint(point));
// view的中心点
CGPoint center = self.center;
center.x += point.x;
center.y += point.y;
self.center = center;
// 每次获取到手势中滑动的距离,然后把这个距离让view移动,移动之后把距离清零
[recognizer setTranslation:CGPointZero inView:[self superview]];
}
- (void)pinch:(UIPinchGestureRecognizer *)recognizer{
NSLog(@"scale %f",recognizer.scale);
// 每一次当上一次的基础上 去改变刻度
self.transform = CGAffineTransformScale(self.transform, recognizer.scale, recognizer.scale);
// 缩放之后 重置刻度
recognizer.scale = 1;
}
- (void)rotation:(UIRotationGestureRecognizer *)recognizer{
NSLog(@"rotation %f",recognizer.rotation);
self.transform = CGAffineTransformRotate(self.transform, recognizer.rotation);
recognizer.rotation = 0;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
return YES;
}
- (void)longPress:(UILongPressGestureRecognizer *)recognizer{
if (recognizer.state == UIGestureRecognizerStateBegan){
NSLog(@"longpress");
UIMenuController *menuController = [UIMenuController sharedMenuController];
UIMenuItem *item = [[UIMenuItem alloc] initWithTitle:@"重置" action:@selector(reset)];
UIMenuItem *item1 = [[UIMenuItem alloc] initWithTitle:@"复制" action:@selector(copyString)];
menuController.menuItems = @[item,item1];
// 获取长按的点
CGPoint point = [recognizer locationInView:self];
// 绑定位置
[menuController setTargetRect:CGRectMake(point.x, point.y, 0, 0) inView:self];
// 让它显示
[menuController setMenuVisible:YES animated:YES];
// 让当前的view成为第一响应
[self becomeFirstResponder];
}
}
- (void)reset{
NSLog(@"reset");
[UIView animateWithDuration:0.3 animations:^{
self.center = CGPointMake(160, 240);
// 回到默认的状态
self.transform = CGAffineTransformIdentity;
}];
}
- (void)copyString{
NSLog(@"copyString");
// 通过代码的方式 往系统内部的粘贴板中 复制东西
UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
pasteBoard.string = @"手势手势";
}
- (BOOL)canBecomeFirstResponder{
return YES;
}