ios手势
iOS 手势操作:拖动、捏合、旋转、点按、长按、轻扫、自定义
1、UIGestureRecognizer 介绍
手势识别在 iOS 中非常重要,他极大地提高了移动设备的使用便捷性。
iOS 系统在 3.2 以后,他提供了一些常用的手势(UIGestureRecognizer 的子类),开发者可以直接使用他们进行手势操作。
UIPanGestureRecognizer(拖动)
UIPinchGestureRecognizer(捏合)
UIRotationGestureRecognizer(旋转)
UITapGestureRecognizer(点按)
UILongPressGestureRecognizer(长按)
UISwipeGestureRecognizer(轻扫)
另外,可以通过继承 UIGestureRecognizer 类,实现自定义手势(手势识别器类)。
PS:自定义手势时,需要 #import <UIKit/UIGestureRecognizerSubclass.h>,一般需实现如下方法:

- 1 - (void)reset;
- 2
- 3 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- 4 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- 5 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- 6 - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
- 7 //以上方法在分类 UIGestureRecognizer (UIGestureRecognizerProtected) 中声明,更多方法声明请自行查看

UIGestureRecognizer 的继承关系如下:
2、手势状态
在六种手势识别中,只有一种手势是离散型手势,他就是 UITapGestureRecognizer。
离散型手势的特点就是:一旦识别就无法取消,而且只会调用一次手势操作事件(初始化手势时指定的回调方法)。
换句话说其他五种手势是连续型手势,而连续型手势的特点就是:会多次调用手势操作事件,而且在连续手势识别后可以取消手势。从下图可以看出两者调用操作事件的次数是不同的:
手势状态枚举如下:

- 1 typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
- 2 UIGestureRecognizerStatePossible, // 尚未识别是何种手势操作(但可能已经触发了触摸事件),默认状态
- 3 UIGestureRecognizerStateBegan, // 手势已经开始,此时已经被识别,但是这个过程中可能发生变化,手势操作尚未完成
- 4 UIGestureRecognizerStateChanged, // 手势状态发生转变
- 5 UIGestureRecognizerStateEnded, // 手势识别操作完成(此时已经松开手指)
- 6 UIGestureRecognizerStateCancelled, // 手势被取消,恢复到默认状态
- 7 UIGestureRecognizerStateFailed, // 手势识别失败,恢复到默认状态
- 8 UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 手势识别完成,同UIGestureRecognizerStateEnded
- 9 };

- 对于离散型手势 UITapGestureRecgnizer 要么被识别,要么失败,点按(假设点按次数设置为1,并且没有添加长按手势)下去一次不松开则此时什么也不会发生,松开手指立即识别并调用操作事件,并且状态为3(已完成)。
但是连续型手势要复杂一些,就拿旋转手势来说,如果两个手指点下去不做任何操作,此时并不能识别手势(因为我们还没旋转)但是其实已经触发了触摸开始事件,此时处于状态0;如果此时旋转会被识别,也就会调用对应的操作事件,同时状态变成1(手势开始),但是状态1只有一瞬间;紧接着状态变为2(因为我们的旋转需要持续一会),并且重复调用操作事件(如果在事件中打印状态会重复打印2);松开手指,此时状态变为3,并调用1次操作事件。
3、使用手势的步骤
使用手势很简单,分为三步:
创建手势识别器对象实例。创建时,指定一个回调方法,当手势开始,改变、或结束时,执行回调方法。
设置手势识别器对象实例的相关属性(可选部分)
添加到需要识别的 View 中。每个手势只对应一个 View,当屏幕触摸在 View 的边界内时,如果手势和预定的一样,那就会执行回调方法。
PS:一个手势只能对应一个 View,但是一个 View 可以有多个手势。建议在真机上测试这些手势,模拟器操作不太方便,可能导致认为手势失效的情况。(模拟器测试捏合和旋转手势时,按住 option 键,再用触摸板或鼠标操作)
4、举例说明
功能描述:
附加到两个图片视图 UIImageView 的有『拖动』、『捏合』、『旋转』、『点按』;
而『轻扫』和『自定义手势 KMGestureRecognizer』附加在根视图 UIView 中。
拖动:进行当前图片视图位置移动
捏合:进行当前图片视图缩放
旋转:进行当前图片视图角度旋转
点按:双击恢复当前图片视图的缩放、角度旋转、不透明度
长按:设置当前图片视图的不透明度为0.7
轻扫:左右轻扫设置两个图片视图为居中,同时以垂直居中的特定偏移量定位
自定义手势:挠痒功能,左右扫动共3次或以上,设置两个图片视图为居中,同时以水平居中的特定偏移量定位
效果如下:
KMGestureRecognizer.h

- 1 #import <UIKit/UIKit.h>
- 2
- 3 typedef NS_ENUM(NSUInteger, Direction) {
- 4 DirectionUnknown,
- 5 DirectionLeft,
- 6 DirectionRight
- 7 };
- 8
- 9 @interface KMGestureRecognizer : UIGestureRecognizer
- 10 @property (assign, nonatomic) NSUInteger tickleCount; //挠痒次数
- 11 @property (assign, nonatomic) CGPoint currentTickleStart; //当前挠痒开始坐标位置
- 12 @property (assign, nonatomic) Direction lastDirection; //最后一次挠痒方向
- 13
- 14 @end

KMGestureRecognizer.m

- 1 #import "KMGestureRecognizer.h"
- 2 #import <UIKit/UIGestureRecognizerSubclass.h>
- 3
- 4 @implementation KMGestureRecognizer
- 5 #define kMinTickleSpacing 20.0
- 6 #define kMaxTickleCount 3
- 7
- 8 - (void)reset {
- 9 _tickleCount = 0;
- 10 _currentTickleStart = CGPointZero;
- 11 _lastDirection = DirectionUnknown;
- 12
- 13 if (self.state == UIGestureRecognizerStatePossible) {
- 14 self.state = UIGestureRecognizerStateFailed;
- 15 }
- 16 }
- 17
- 18 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
- 19 UITouch *touch = [touches anyObject];
- 20 _currentTickleStart = [touch locationInView:self.view]; //设置当前挠痒开始坐标位置
- 21 }
- 22
- 23 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
- 24 //『当前挠痒开始坐标位置』和『移动后坐标位置』进行 X 轴值比较,得到是向左还是向右移动
- 25 UITouch *touch = [touches anyObject];
- 26 CGPoint tickleEnd = [touch locationInView:self.view];
- 27 CGFloat tickleSpacing = tickleEnd.x - _currentTickleStart.x;
- 28 Direction currentDirection = tickleSpacing < 0 ? DirectionLeft : DirectionRight;
- 29
- 30 //移动的 X 轴间距值是否符合要求,足够大
- 31 if (ABS(tickleSpacing) >= kMinTickleSpacing) {
- 32 //判断是否有三次不同方向的动作,如果有则手势结束,将执行回调方法
- 33 if (_lastDirection == DirectionUnknown ||
- 34 (_lastDirection == DirectionLeft && currentDirection == DirectionRight) ||
- 35 (_lastDirection == DirectionRight && currentDirection == DirectionLeft)) {
- 36 _tickleCount++;
- 37 _currentTickleStart = tickleEnd;
- 38 _lastDirection = currentDirection;
- 39
- 40 if (_tickleCount >= kMaxTickleCount && self.state == UIGestureRecognizerStatePossible) {
- 41 self.state = UIGestureRecognizerStateEnded;
- 42 //NSLog(@"自定义手势成功,将执行回调方法");
- 43 }
- 44 }
- 45 }
- 46 }
- 47
- 48 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
- 49 [self reset];
- 50 }
- 51
- 52 - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
- 53 [self reset];
- 54 }
- 55
- 56 @end

ViewController.h

- 1 #import <UIKit/UIKit.h>
- 2 #import "KMGestureRecognizer.h"
- 3
- 4 @interface ViewController : UIViewController
- 5 @property (strong, nonatomic) UIImageView *imgV;
- 6 @property (strong, nonatomic) UIImageView *imgV2;
- 7 @property (strong, nonatomic) KMGestureRecognizer *customGestureRecognizer;
- 8
- 9 @end

ViewController.m

- 1 #import "ViewController.h"
- 2
- 3 @interface ViewController ()
- 4 - (void)handlePan:(UIPanGestureRecognizer *)recognizer;
- 5 - (void)handlePinch:(UIPinchGestureRecognizer *)recognizer;
- 6 - (void)handleRotation:(UIRotationGestureRecognizer *)recognizer;
- 7 - (void)handleTap:(UITapGestureRecognizer *)recognizer;
- 8 - (void)handleLongPress:(UILongPressGestureRecognizer *)recognizer;
- 9 - (void)handleSwipe:(UISwipeGestureRecognizer *)recognizer;
- 10 - (void)handleCustomGestureRecognizer:(KMGestureRecognizer *)recognizer;
- 11
- 12 - (void)bindPan:(UIImageView *)imgVCustom;
- 13 - (void)bindPinch:(UIImageView *)imgVCustom;
- 14 - (void)bindRotation:(UIImageView *)imgVCustom;
- 15 - (void)bindTap:(UIImageView *)imgVCustom;
- 16 - (void)bindLongPress:(UIImageView *)imgVCustom;
- 17 - (void)bindSwipe;
- 18 - (void)bingCustomGestureRecognizer;
- 19 - (void)layoutUI;
- 20 @end
- 21
- 22 @implementation ViewController
- 23
- 24 - (void)viewDidLoad {
- 25 [super viewDidLoad];
- 26
- 27 [self layoutUI];
- 28 }
- 29
- 30 - (void)didReceiveMemoryWarning {
- 31 [super didReceiveMemoryWarning];
- 32 // Dispose of any resources that can be recreated.
- 33 }
- 34
- 35 #pragma mark - 处理手势操作
- 36 /**
- 37 * 处理拖动手势
- 38 *
- 39 * @param recognizer 拖动手势识别器对象实例
- 40 */
- 41 - (void)handlePan:(UIPanGestureRecognizer *)recognizer {
- 42 //视图前置操作
- 43 [recognizer.view.superview bringSubviewToFront:recognizer.view];
- 44
- 45 CGPoint center = recognizer.view.center;
- 46 CGFloat cornerRadius = recognizer.view.frame.size.width / 2;
- 47 CGPoint translation = [recognizer translationInView:self.view];
- 48 //NSLog(@"%@", NSStringFromCGPoint(translation));
- 49 recognizer.view.center = CGPointMake(center.x + translation.x, center.y + translation.y);
- 50 [recognizer setTranslation:CGPointZero inView:self.view];
- 51
- 52 if (recognizer.state == UIGestureRecognizerStateEnded) {
- 53 //计算速度向量的长度,当他小于200时,滑行会很短
- 54 CGPoint velocity = [recognizer velocityInView:self.view];
- 55 CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y));
- 56 CGFloat slideMult = magnitude / 200;
- 57 //NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult); //e.g. 397.973175, slideMult: 1.989866
- 58
- 59 //基于速度和速度因素计算一个终点
- 60 float slideFactor = 0.1 * slideMult;
- 61 CGPoint finalPoint = CGPointMake(center.x + (velocity.x * slideFactor),
- 62 center.y + (velocity.y * slideFactor));
- 63 //限制最小[cornerRadius]和最大边界值[self.view.bounds.size.width - cornerRadius],以免拖动出屏幕界限
- 64 finalPoint.x = MIN(MAX(finalPoint.x, cornerRadius),
- 65 self.view.bounds.size.width - cornerRadius);
- 66 finalPoint.y = MIN(MAX(finalPoint.y, cornerRadius),
- 67 self.view.bounds.size.height - cornerRadius);
- 68
- 69 //使用 UIView 动画使 view 滑行到终点
- 70 [UIView animateWithDuration:slideFactor*2
- 71 delay:0
- 72 options:UIViewAnimationOptionCurveEaseOut
- 73 animations:^{
- 74 recognizer.view.center = finalPoint;
- 75 }
- 76 completion:nil];
- 77 }
- 78 }
- 79
- 80 /**
- 81 * 处理捏合手势
- 82 *
- 83 * @param recognizer 捏合手势识别器对象实例
- 84 */
- 85 - (void)handlePinch:(UIPinchGestureRecognizer *)recognizer {
- 86 CGFloat scale = recognizer.scale;
- 87 recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, scale, scale); //在已缩放大小基础下进行累加变化;区别于:使用 CGAffineTransformMakeScale 方法就是在原大小基础下进行变化
- 88 recognizer.scale = 1.0;
- 89 }
- 90
- 91 /**
- 92 * 处理旋转手势
- 93 *
- 94 * @param recognizer 旋转手势识别器对象实例
- 95 */
- 96 - (void)handleRotation:(UIRotationGestureRecognizer *)recognizer {
- 97 recognizer.view.transform = CGAffineTransformRotate(recognizer.view.transform, recognizer.rotation);
- 98 recognizer.rotation = 0.0;
- 99 }
- 100
- 101 /**
- 102 * 处理点按手势
- 103 *
- 104 * @param recognizer 点按手势识别器对象实例
- 105 */
- 106 - (void)handleTap:(UITapGestureRecognizer *)recognizer {
- 107 UIView *view = recognizer.view;
- 108 view.transform = CGAffineTransformMakeScale(1.0, 1.0);
- 109 view.transform = CGAffineTransformMakeRotation(0.0);
- 110 view.alpha = 1.0;
- 111 }
- 112
- 113 /**
- 114 * 处理长按手势
- 115 *
- 116 * @param recognizer 点按手势识别器对象实例
- 117 */
- 118 - (void)handleLongPress:(UILongPressGestureRecognizer *)recognizer {
- 119 //长按的时候,设置不透明度为0.7
- 120 recognizer.view.alpha = 0.7;
- 121 }
- 122
- 123 /**
- 124 * 处理轻扫手势
- 125 *
- 126 * @param recognizer 轻扫手势识别器对象实例
- 127 */
- 128 - (void)handleSwipe:(UISwipeGestureRecognizer *)recognizer {
- 129 //代码块方式封装操作方法
- 130 void (^positionOperation)() = ^() {
- 131 CGPoint newPoint = recognizer.view.center;
- 132 newPoint.y -= 20.0;
- 133 _imgV.center = newPoint;
- 134
- 135 newPoint.y += 40.0;
- 136 _imgV2.center = newPoint;
- 137 };
- 138
- 139 //根据轻扫方向,进行不同控制
- 140 switch (recognizer.direction) {
- 141 case UISwipeGestureRecognizerDirectionRight: {
- 142 positionOperation();
- 143 break;
- 144 }
- 145 case UISwipeGestureRecognizerDirectionLeft: {
- 146 positionOperation();
- 147 break;
- 148 }
- 149 case UISwipeGestureRecognizerDirectionUp: {
- 150 break;
- 151 }
- 152 case UISwipeGestureRecognizerDirectionDown: {
- 153 break;
- 154 }
- 155 }
- 156 }
- 157
- 158 /**
- 159 * 处理自定义手势
- 160 *
- 161 * @param recognizer 自定义手势识别器对象实例
- 162 */
- 163 - (void)handleCustomGestureRecognizer:(KMGestureRecognizer *)recognizer {
- 164 //代码块方式封装操作方法
- 165 void (^positionOperation)() = ^() {
- 166 CGPoint newPoint = recognizer.view.center;
- 167 newPoint.x -= 20.0;
- 168 _imgV.center = newPoint;
- 169
- 170 newPoint.x += 40.0;
- 171 _imgV2.center = newPoint;
- 172 };
- 173
- 174 positionOperation();
- 175 }
- 176
- 177
- 178 #pragma mark - 绑定手势操作
- 179 /**
- 180 * 绑定拖动手势
- 181 *
- 182 * @param imgVCustom 绑定到图片视图对象实例
- 183 */
- 184 - (void)bindPan:(UIImageView *)imgVCustom {
- 185 UIPanGestureRecognizer *recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self
- 186 action:@selector(handlePan:)];
- 187 [imgVCustom addGestureRecognizer:recognizer];
- 188 }
- 189
- 190 /**
- 191 * 绑定捏合手势
- 192 *
- 193 * @param imgVCustom 绑定到图片视图对象实例
- 194 */
- 195 - (void)bindPinch:(UIImageView *)imgVCustom {
- 196 UIPinchGestureRecognizer *recognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self
- 197 action:@selector(handlePinch:)];
- 198 [imgVCustom addGestureRecognizer:recognizer];
- 199 //[recognizer requireGestureRecognizerToFail:imgVCustom.gestureRecognizers.firstObject];
- 200 }
- 201
- 202 /**
- 203 * 绑定旋转手势
- 204 *
- 205 * @param imgVCustom 绑定到图片视图对象实例
- 206 */
- 207 - (void)bindRotation:(UIImageView *)imgVCustom {
- 208 UIRotationGestureRecognizer *recognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self
- 209 action:@selector(handleRotation:)];
- 210 [imgVCustom addGestureRecognizer:recognizer];
- 211 }
- 212
- 213 /**
- 214 * 绑定点按手势
- 215 *
- 216 * @param imgVCustom 绑定到图片视图对象实例
- 217 */
- 218 - (void)bindTap:(UIImageView *)imgVCustom {
- 219 UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
- 220 action:@selector(handleTap:)];
- 221 //使用一根手指双击时,才触发点按手势识别器
- 222 recognizer.numberOfTapsRequired = 2;
- 223 recognizer.numberOfTouchesRequired = 1;
- 224 [imgVCustom addGestureRecognizer:recognizer];
- 225 }
- 226
- 227 /**
- 228 * 绑定长按手势
- 229 *
- 230 * @param imgVCustom 绑定到图片视图对象实例
- 231 */
- 232 - (void)bindLongPress:(UIImageView *)imgVCustom {
- 233 UILongPressGestureRecognizer *recognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
- 234 recognizer.minimumPressDuration = 0.5; //设置最小长按时间;默认为0.5秒
- 235 [imgVCustom addGestureRecognizer:recognizer];
- 236 }
- 237
- 238 /**
- 239 * 绑定轻扫手势;支持四个方向的轻扫,但是不同的方向要分别定义轻扫手势
- 240 */
- 241 - (void)bindSwipe {
- 242 //向右轻扫手势
- 243 UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self
- 244 action:@selector(handleSwipe:)];
- 245 recognizer.direction = UISwipeGestureRecognizerDirectionRight; //设置轻扫方向;默认是 UISwipeGestureRecognizerDirectionRight,即向右轻扫
- 246 [self.view addGestureRecognizer:recognizer];
- 247 [recognizer requireGestureRecognizerToFail:_customGestureRecognizer]; //设置以自定义挠痒手势优先识别
- 248
- 249 //向左轻扫手势
- 250 recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self
- 251 action:@selector(handleSwipe:)];
- 252 recognizer.direction = UISwipeGestureRecognizerDirectionLeft;
- 253 [self.view addGestureRecognizer:recognizer];
- 254 [recognizer requireGestureRecognizerToFail:_customGestureRecognizer]; //设置以自定义挠痒手势优先识别
- 255 }
- 256
- 257 /**
- 258 * 绑定自定义挠痒手势;判断是否有三次不同方向的动作,如果有则手势结束,将执行回调方法
- 259 */
- 260 - (void)bingCustomGestureRecognizer {
- 261 //当 recognizer.state 为 UIGestureRecognizerStateEnded 时,才执行回调方法 handleCustomGestureRecognizer:
- 262
- 263 //_customGestureRecognizer = [KMGestureRecognizer new];
- 264 _customGestureRecognizer = [[KMGestureRecognizer alloc] initWithTarget:self
- 265 action:@selector(handleCustomGestureRecognizer:)];
- 266 [self.view addGestureRecognizer:_customGestureRecognizer];
- 267 }
- 268
- 269 - (void)layoutUI {
- 270 //图片视图 _imgV
- 271 UIImage *img = [UIImage imageNamed:@"Emoticon_tusiji_icon"];
- 272 CGFloat cornerRadius = img.size.width;
- 273 _imgV = [[UIImageView alloc] initWithImage:img];
- 274 _imgV.frame = CGRectMake(20.0, 20.0,
- 275 cornerRadius * 2, cornerRadius * 2);
- 276 _imgV.userInteractionEnabled = YES;
- 277 _imgV.layer.masksToBounds = YES;
- 278 _imgV.layer.cornerRadius = cornerRadius;
- 279 _imgV.layer.borderWidth = 2.0;
- 280 _imgV.layer.borderColor = [UIColor grayColor].CGColor;
- 281 [self.view addSubview:_imgV];
- 282
- 283 //图片视图 _imgV2
- 284 img = [UIImage imageNamed:@"Emoticon_tusiji_icon2"];
- 285 cornerRadius = img.size.width;
- 286 _imgV2 = [[UIImageView alloc] initWithImage:img];
- 287 _imgV2.frame = CGRectMake(20.0, 40.0 + _imgV.frame.size.height,
- 288 cornerRadius * 2, cornerRadius * 2);
- 289 _imgV2.userInteractionEnabled = YES;
- 290 _imgV2.layer.masksToBounds = YES;
- 291 _imgV2.layer.cornerRadius = cornerRadius;
- 292 _imgV2.layer.borderWidth = 2.0;
- 293 _imgV2.layer.borderColor = [UIColor orangeColor].CGColor;
- 294 [self.view addSubview:_imgV2];
- 295
- 296
- 297 [self bindPan:_imgV];
- 298 [self bindPinch:_imgV];
- 299 [self bindRotation:_imgV];
- 300 [self bindTap:_imgV];
- 301 [self bindLongPress:_imgV];
- 302
- 303 [self bindPan:_imgV2];
- 304 [self bindPinch:_imgV2];
- 305 [self bindRotation:_imgV2];
- 306 [self bindTap:_imgV2];
- 307 [self bindLongPress:_imgV2];
- 308
- 309 //为了处理手势识别优先级的问题,这里需先绑定自定义挠痒手势
- 310 [self bingCustomGestureRecognizer];
- 311 [self bindSwipe];
- 312 }
- 313
- 314 @end
ios手势的更多相关文章
- iOS手势学习UIGestureRecognizer & cocos2d 手势推荐
iOS手势学习UIGestureRecognizer & cocos2d 手势推荐 手势识别类型: UILongPressGestureRecognizer // 长按UIPanGestur ...
- iOS手势处理
iOS手势处理 iOS手势有着如下几种: UITapGestureRecognizer UIPinchGestureRecognizer UIRotationGestureRecognizer UIS ...
- iOS 手势识别器概述
手势识别器 iOS 手势识别器(UIGestureRecognizer) 点击手势(UITapGestureRecognizer) 滑动手势(UISwipeGestureRecognizer) 旋转手 ...
- swift 实现iOS手势密码、指纹密码、faceID
本博客包含了如何实现iOS手势密码.指纹密码.faceID全步骤,包括了完整的代码. 先附上demo地址https://github.com/Liuyubao/LYBTouchID,支持swift3. ...
- iOS手势解锁、指纹解锁--Swift代码
一.手势密码 1. 1.1.用UIButton组成手势的节点. 1.2.当手指接触屏幕时,调用重写的 touchesBegan:withEvent方法(在touchesBegan里调用setNeeds ...
- IOS 手势-轻点、触摸、手势、事件
1.概念 手势是从你用一个或多个手指接触屏幕时开始,直到手指离开屏幕为止所发生的所有事件.无论手势持续多长时间,只要一个或多个手指仍在屏幕上,这个手势就存在. 触摸是指把手指放到IOS设备的屏幕上,从 ...
- IOS 手势详解
在IOS中手势可以让用户有很好的体验,因此我们有必要去了解一下手势. (在设置手势是有很多值得注意的地方) *是需要设置为Yes的点击无法响应* *要把手势添加到所需点击的View,否则无法响应* 手 ...
- iOS 手势操作:拖动、捏合、旋转、点按、长按、轻扫、自定义
1.UIGestureRecognizer 介绍 手势识别在 iOS 中非常重要,他极大地提高了移动设备的使用便捷性. iOS 系统在 3.2 以后,他提供了一些常用的手势(UIGestureReco ...
- IOS 手势事件的冲突
关于手操作需要强调几点: UIImageView默认是不支持交互的,也就是userInteractionEnabled=NO ,因此要接收触摸事件(手势识别),必须设置userInteractionE ...
随机推荐
- Linux下运行C语言程序
一.编写C语言的源代码 二.用gcc -c C文件名生成.o文件 三.用gcc -o 可执行文件名 .o文件名 生成可执行文件 四.输入可执行文件名前加./执行可执行文件
- 【bzoj3573】[HNOI2014]米特运输
题目描述 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题.D星上有N个城市,我们将其顺序编号为1到N,1号城市为首都.这N个城 ...
- C# 读写App.config
Jul142013 [C#] 读写App.config配置文件的方法 作者:xieyc 发布:2013-07-14 17:29 字符数:3433 分类:编程 阅读: 39,139 次 ...
- maven之helloworld案例
1.maven目录结构 src -main -java -package -test -java -package -resources 2.新建目录 在任意指定盘下建文件夹(我的是D盘,目录结构如下 ...
- 比较两个数据库表table结构不同之处
/*--比较两个数据库的表字段差异 hy 适用多种版本库 --*/ /*--调用示例 exec p_comparestructure 'database1','database2' --*/ ) dr ...
- CSS Image Sprite--网页图片应用处理方式
CSS Sprites简介 CSSSprites在国内很多人叫css精 灵,是一种网页图片应用处理方式.它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来,当访问该页面时,载入的图片 ...
- hibernate 的三种状态 如何转化的。
1. 临时状态 由 new命令开辟内存空间的java对象,例如: User user=new User(); 临 时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系. 2. ...
- linux下使用rdp
简单的说就是在linux下如何远程终端连接一台windows的服务器. 在windwos下我们直接可以mstsc开启远程终端的连接.而linux下呢.就需要安装一款工具了. 命令:sudo apt-g ...
- hiho #1223 不等式
#1223 : 不等式 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定n个关于X的不等式,问最多有多少个成立. 每个不等式为如下的形式之一: X < C X ...
- Python自动化之多进程
多进程multiprocessing from multiprocessing import Process import os def info(title): print(title) print ...