简介
系统一共提供了六大手势,如果想要使用其他手势怎么办呢?那就只能来自定义手势,来实现自己想要的酷炫效果。
Demo在GitHub地址
可以留言留下你酷炫的手势想法,我会尝试加进Demo里。
实现方式
1、创建一个手势类,继承UIGestureRecognizer
2、重写必要的方法
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
在这些方法里写一些自己的逻辑,来判断用户的手势是不是自己规定的手势,并在合适的位置修改self.state(因为是只读属性,需要使用KVC修改)。来控制什么时候调用添加的target-action。
示例
目标实现的手势:左右滑动一定距离,一定来回触发的手势(可以认为是抖动)。
主要代码
.h文件
#import <UIKit/UIKit.h>
@interface trembleGestureRecognizer : UIGestureRecognizer
@property (nonatomic,assign) int numberOfTurnRequired; //需要转动几次方向 默认为2.
@property (nonatomic,assign) CGFloat movementRequired;//每次需要向左或者向右多少距离。 默认为50
@property (nonatomic) CGFloat allowableMovement; //允许的误差值,例如向右时突然向左一点,并不判断失败。 默认为20
@end
.m文件主要代码
@property(nonatomic,assign)CGPoint lastTurnPoint; //上次运动方向的最后位置
@property(nonatomic,assign)Direction lastDirection; //上次的运动方向
@property(nonatomic,assign)int turnCount; //目前的转向次数
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch * touch = [touches anyObject];
self.lastTurnPoint = [touch locationInView:self.view];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch * touch = [touches anyObject];
int nowX = [touch locationInView:self.view].x;
//初始状态
if(self.lastDirection == DirectionNil){
//向右超过额定允许误差,记录方向
if(nowX - self.lastTurnPoint.x > self.allowableMovement){
self.lastDirection = DirectionRight;
}
//向左
else if (nowX - self.lastTurnPoint.x < -self.allowableMovement){
self.lastDirection = DirectionLeft;
}
}
//如果上次是向左
if(self.lastDirection == DirectionLeft){
//如果现在是在左边,则更新转向点为现在的点(不断更新最左点的值)
if(nowX - self.lastTurnPoint.x < 0){
self.lastTurnPoint = [touch locationInView:self.view];
};
//如果现在是在右边,如果与转向点相差大于要求的距离,则记录该点为转折点,增加转折次数,并更新上次的方向。(变为向右了)
if (nowX - self.lastTurnPoint.x >self.movementRequired) {
self.lastTurnPoint = [touch locationInView:self.view];
self.turnCount++;
self.lastDirection = DirectionRight;
}
}
//如果上次是向右
if(self.lastDirection == DirectionRight){
if(nowX - self.lastTurnPoint.x > 0){
self.lastTurnPoint = [touch locationInView:self.view];
};
if(nowX - self.lastTurnPoint.x < -self.movementRequired){
self.lastTurnPoint = [touch locationInView:self.view];
self.turnCount++;
self.lastDirection = DirectionLeft;
}
}
//如果转向已经到达规定次数,结束手势,触发action。并重置手势记录数据
if(self.turnCount >= self.numberOfTurnRequired){
[self setState:UIGestureRecognizerStateEnded];
[self reset];
}
}
//重置手势记录数据
- (void)reset {
self.turnCount = 0;
self.lastDirection = DirectionNil;
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[self reset];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
[self reset];
}
网友评论