iOS轻点、触摸和手势代码开发

一、响应者链

以UIResponder作为超类的任何类都是响应者。UIView和UIControl是UIReponder的子类,因此所有视图和所有控件都是响应者。

1、初始相应器
事件首先会传递给UIApplication对象,接下来会传递给应用程序的UIWindow,UIWindow会选择一个初始相应器来处理事件。初始响应器会选择下面的方式选择1、对于触摸事件,UIWindow会确定用户触摸的视图,然后将事件交给注册了这个视图的手势识别器或则注册视图层级更高的手势识别器。只要存在能处理事件的识别器,就不会再继续找了。如果没有的话,被触摸视图就是初始相应器,事件也会传递给它。

2、对于用户摇晃设备产生的或者是来自远程遥控设备事件,将会传递给第一响应器
如果初始响应器不处理时间,它会将事件传递给它的父视图(如果存在的话),或者传递给视图控制器(如果此视图是视图控制器的视图)。如果视图控制器不处理事件,它将沿着响应器链的层级继续传给父视图控制器(如果存在的话)。
如果在整个视图层级中都没与能处理事件的视图或控制器,事件就会被传递给应用程序的窗口。如果窗口不能处理事件,而应用委托是UIResponder的子类,UIApplication对象就会将其传递给应用程序委托。最后,如果应用委托不是UIResponder的子类,或者不处理这个事件,那么这个事件将会被丢弃。

4个手势通知方法

#pragma mark - Touch Event Methods
// 用户第一次触摸屏幕时被调用
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{

}

// 当发生某些事件(如来电呼叫)导致手势中断时被调用
- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{

}

// 当用户手指离开屏幕时被调用
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{

}

// 当用户手指移动时触发
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{

}

二、检测扫描事件

1、手动检测

//
// ViewController.m
// Swipes
//
// Created by Jierism on 16/8/4.
// Copyright © 2016年 Jierism. All rights reserved.
//

#import "ViewController.h"
// 设置检测范围
static CGFloat const kMinimmGestureLength = 25;
static CGFloat const kMaximmVariance = 5;

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *label;
@property (nonatomic) CGPoint gestureStartPoint;
@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
  // Dispose of any resources that can be recreated.
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
  UITouch *touch = [touches anyObject];
  self.gestureStartPoint = [touch locationInView:self.view];
}

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
  UITouch *touch = [touches anyObject];
  CGPoint currentPosition = [touch locationInView:self.view];
  // 返回一个float的绝对值
  CGFloat deltaX = fabsf(self.gestureStartPoint.x - currentPosition.x);
  CGFloat deltaY = fabsf(self.gestureStartPoint.y - currentPosition.y);

  // 获得两个增量后,判断用户在两个方向上移动过的距离,检测用户是否在一个方向上移动得足够远但在另一个方向移动得不够来形成轻扫动作
  if (deltaX >= kMinimmGestureLength && deltaY <= kMaximmVariance) {
    self.label.text = @"Horizontal swipe detected";
    // 2s后擦除文本
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)),
            dispatch_get_main_queue(),
            ^{
      self.label.text = @"";
    });
  }else if (deltaY >= kMinimmGestureLength && deltaX <= kMaximmVariance){
    self.label.text = @"Vertical swipe detected";
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
      self.label.text = @"";
    });
  }
}

@end

2、识别器检测

//
// ViewController.m
// Swipes
//
// Created by Jierism on 16/8/4.
// Copyright © 2016年 Jierism. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *label;
@property (nonatomic) CGPoint gestureStartPoint;
@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.
  //创建两个手势识别器
  // 1、水平方向识别器
  UISwipeGestureRecognizer *horizontal = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(reportHorizontalSwipe:)];

  horizontal.direction = UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight;
  [self.view addGestureRecognizer:horizontal];

  // 2、垂直方向识别器
  UISwipeGestureRecognizer *vertical = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(reportVerticalSwipe:)];
  vertical.direction = UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown;
  [self.view addGestureRecognizer:vertical];
}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
  // Dispose of any resources that can be recreated.
}

- (void)reportHorizontalSwipe:(UIGestureRecognizer *)recognizer
{

  self.label.text = @"Horizontal swipe detected";
  // 2s后擦除文本
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)),
          dispatch_get_main_queue(),
          ^{
            self.label.text = @"";
          });
}

- (void)reportVerticalSwipe:(UIGestureRecognizer *)recognizer
{
  self.label.text = @"Vertical swipe detected";
  // 2s后擦除文本
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)),
          dispatch_get_main_queue(),
          ^{
            self.label.text = @"";
          });
}

@end

三、实现多指轻扫

//
// ViewController.m
// Swipes
//
// Created by Jierism on 16/8/4.
// Copyright © 2016年 Jierism. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *label;
@property (nonatomic) CGPoint gestureStartPoint;
@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.

  for (NSUInteger touchCount = 1; touchCount <= 5; touchCount++) {
    //创建两个手势识别器
    // 1、水平方向识别器
    UISwipeGestureRecognizer *horizontal = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(reportHorizontalSwipe:)];

    horizontal.direction = UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight;
    [self.view addGestureRecognizer:horizontal];

    // 2、垂直方向识别器
    UISwipeGestureRecognizer *vertical = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(reportVerticalSwipe:)];
    vertical.direction = UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown;
    [self.view addGestureRecognizer:vertical];
  }

}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
  // Dispose of any resources that can be recreated.
}

- (NSString *)descriptionForTouchCount:(NSUInteger)touchCount
{
  switch (touchCount) {
    case 1:
      return @"Single";
    case 2:
      return @"Double";
    case 3:
      return @"Triple";
    case 4:
      return @"Quadruple";
    case 5:
      return @"Quintuple";

    default:
      return @"";
  }
}

- (void)reportHorizontalSwipe:(UIGestureRecognizer *)recognizer
{

  self.label.text = [NSString stringWithFormat:@"%@ Horizontal swipe detected",[self descriptionForTouchCount:[recognizer numberOfTouches]]];
  // 2s后擦除文本
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)),
          dispatch_get_main_queue(),
          ^{
            self.label.text = @"";
          });
}

- (void)reportVerticalSwipe:(UIGestureRecognizer *)recognizer
{
  self.label.text = [NSString stringWithFormat:@"%@ Vertical swipe detected",[self descriptionForTouchCount:[recognizer numberOfTouches]]];
  // 2s后擦除文本
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)),
          dispatch_get_main_queue(),
          ^{
            self.label.text = @"";
          });
}

@end

四、检测多次轻点

//
// ViewController.m
// TapTaps
//
// Created by Jierism on 16/8/4.
// Copyright © 2016年 Jierism. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *singleLabel;
@property (weak, nonatomic) IBOutlet UILabel *doubleLabel;
@property (weak, nonatomic) IBOutlet UILabel *tripleLabel;
@property (weak, nonatomic) IBOutlet UILabel *quadrupleLabel;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.
  // 创建4个点击手势识别器
  UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap)];
  singleTap.numberOfTapsRequired = 1;
  singleTap.numberOfTouchesRequired = 1;
  // 附加到视图
  [self.view addGestureRecognizer:singleTap];

  UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap)];
  doubleTap.numberOfTapsRequired = 2;
  doubleTap.numberOfTouchesRequired = 1;
  [self.view addGestureRecognizer:doubleTap];
  // 当doubleTap响应“失败”才运行singleTap
  [singleTap requireGestureRecognizerToFail:doubleTap];

  UITapGestureRecognizer *tripleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tripleTap)];
  tripleTap.numberOfTapsRequired = 3;
  tripleTap.numberOfTouchesRequired = 1;
  [self.view addGestureRecognizer:tripleTap];
  [doubleTap requireGestureRecognizerToFail:tripleTap];

  UITapGestureRecognizer *quadrupleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(quadrupleTap)];
  quadrupleTap.numberOfTapsRequired = 4;
  quadrupleTap.numberOfTouchesRequired = 1;
  [self.view addGestureRecognizer:quadrupleTap];
  [tripleTap requireGestureRecognizerToFail:quadrupleTap];
}

- (void)singleTap
{
  self.singleLabel.text = @"Single Tap Detected";
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    self.singleLabel.text = @"";
  });
}

- (void)doubleTap
{
  self.doubleLabel.text = @"Double Tap Detected";
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    self.doubleLabel.text = @"";
  });
}

- (void)tripleTap
{
  self.tripleLabel.text = @"Triple Tap Detected";
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    self.tripleLabel.text = @"";
  });
}

- (void)quadrupleTap
{
  self.quadrupleLabel.text = @"Quadruple Tap Detected";
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    self.quadrupleLabel.text = @"";
  });
}

@end

五、检测捏合和旋转

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UIGestureRecognizerDelegate>

@end
//
// ViewController.m
// PinchMe
//
// Created by Jierism on 16/8/4.
// Copyright © 2016年 Jierism. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@property (strong,nonatomic) UIImageView *imageView;

@end

@implementation ViewController

// 当前缩放比例,先前缩放比例
CGFloat scale,previousScale;
// 当前旋转角度,先前旋转角度
CGFloat rotation,previousRotation;

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.
  previousScale = 1;

  UIImage *image = [UIImage imageNamed:@"yosemite-meadows"];
  self.imageView = [[UIImageView alloc] initWithImage:image];
  // 对图像启用交互功能
  self.imageView.userInteractionEnabled = YES;
  self.imageView.center = self.view.center;
  [self.view addSubview:self.imageView];

  // 建立捏合手势识别器
  UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(doPinch:)];
  pinchGesture.delegate = self;
  [self.imageView addGestureRecognizer:pinchGesture];

  // 建立旋转手势识别器
  UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(doRorate:)];
  rotationGesture.delegate = self;
  [self.imageView addGestureRecognizer:rotationGesture];
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
  // 允许捏合手势和旋转手势同时工作。否则,先开始的手势识别器会屏蔽另一个
  return YES;
}

// 根据手势识别器中获得的缩放比例和旋转角度对图像进行变换
- (void)transformImageView
{
  CGAffineTransform t = CGAffineTransformMakeScale(scale * previousScale, scale * previousScale);
  t = CGAffineTransformRotate(t, rotation + previousRotation);
  self.imageView.transform = t;
}

- (void)doPinch:(UIPinchGestureRecognizer *)gesture
{
  scale = gesture.scale;
  [self transformImageView];
  if (gesture.state == UIGestureRecognizerStateEnded) {
    previousScale = scale * previousScale;
    scale = 1;
  }
}

- (void)doRorate:(UIRotationGestureRecognizer *)gesture
{
  rotation = gesture.rotation;
  [self transformImageView];
  if (gesture.state == UIGestureRecognizerStateEnded) {
    previousRotation = rotation + previousRotation;
    rotation = 0;
  }
}

@end

六、自定义手势

//
// CheckMarkRecognizer.m
// CheckPlease
//
// Created by Jierism on 16/8/4.
// Copyright © 2016年 Jierism. All rights reserved.
//

#import "CheckMarkRecognizer.h"
#import "CGPointUtils.h"
#import <UIKit/UIGestureRecognizerSubclass.h> // 一个重要目的是使手势识别器的state属性可写,子类将使用这个机制断言我们所观察的手势已成功完成

// 设置检测范围
static CGFloat const kMinimunCheckMarkAngle = 80;
static CGFloat const kMaximumCheckMarkAngle = 100;
static CGFloat const kMinimumCheckMarkLength = 10;

@implementation CheckMarkRecognizer{
  // 前两个实例变量提供之前的线段
  CGPoint lastPreviousPoint;
  CGPoint lastCurrentPoint;
  // 画出的线段长度
  CGFloat lineLengthSoFar;
}

// 用lastPreviousPoint和lastCurrentPoint组成第一条线段,跟第二条线段形成角度去完成手势
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
  [super touchesBegan:touches withEvent:event];
  UITouch *touch = [touches anyObject];
  CGPoint point = [touch locationInView:self.view];
  lastPreviousPoint = point;
  lastCurrentPoint = point;
  lineLengthSoFar = 0.0;
}

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
  [super touchesMoved:touches withEvent:event];
  UITouch *touch = [touches anyObject];
  CGPoint previousPoint = [touch previousLocationInView:self.view];
  CGPoint currentPoint = [touch locationInView:self.view];
  CGFloat angle = angleBetweenLines(lastPreviousPoint, lastCurrentPoint, previousPoint, currentPoint);
  if (angle >= kMinimunCheckMarkAngle && angle <= kMaximumCheckMarkAngle && lineLengthSoFar > kMinimumCheckMarkLength) {
    self.state = UIGestureRecognizerStateRecognized;
  }
  lineLengthSoFar += distanceBetweenPoints(previousPoint, currentPoint);
  lastPreviousPoint = previousPoint;
  lastCurrentPoint = currentPoint;
}

@end
//
// ViewController.m
// CheckPlease
//
// Created by Jierism on 16/8/4.
// Copyright © 2016年 Jierism. All rights reserved.
//

#import "ViewController.h"
#import "CheckMarkRecognizer.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.
  CheckMarkRecognizer *check = [[CheckMarkRecognizer alloc] initWithTarget:self action:@selector(doCheck:)];
  [self.view addGestureRecognizer:check];
  self.imageView.hidden = YES;
}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
  // Dispose of any resources that can be recreated.
}

- (void)doCheck:(CheckMarkRecognizer *)check
{
  self.imageView.hidden = NO;
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    self.imageView.hidden = YES;
  });
}

@end

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • IOS中的七种手势小结

    今天为大家介绍一下IOS 的七种手势,手势在开发中经常用到,所以就简单 通俗易懂的说下, 话不多说,直接看代码: // 初始化一个UIimageView UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 300, 300)]; imageView.image = [UIImage imageNamed:@"12.jpg"]; // UIImageView的用户交互是默认关闭的,

  • IOS 七种手势操作(拖动、捏合、旋转、点按、长按、轻扫、自定义)详解及实例代码

    IOS 七种手势操作 今天为大家介绍一下IOS 的七种手势,手势在开发中经常用到,所以就简单 通俗易懂的说下, 话不多说,直接看代码: 1.UIGestureRecognizer 介绍 手势识别在 iOS 中非常重要,他极大地提高了移动设备的使用便捷性. iOS 系统在 3.2 以后,他提供了一些常用的手势(UIGestureRecognizer 的子类),开发者可以直接使用他们进行手势操作. UIPanGestureRecognizer(拖动) UIPinchGestureRecognizer

  • 使用Swift代码实现iOS手势解锁、指纹解锁实例详解

    一.手势密码 1. 1.1.用UIButton组成手势的节点. 1.2.当手指接触屏幕时,调用重写的 touchesBegan:withEvent方法(在touchesBegan里调用setNeedsDisplay,这样就会自动调用drawRect方法). 1.3.当手指在屏幕上滑动时,调用重写的touchesEnded:withEvent方法. 这两个方法执行的操作是一样的:通过locationInView获取 触摸的坐标,然后用 CGRectContainsPoint 判断手指是否经过UIB

  • iOS 用Swipe手势和动画实现循环播放图片示例

    主要想法 添加3个ImageView展示图片,实现图片的无限循环. 使用Swipe手势识别用户向右或向左滑动图片. 使用CATransition给ImageView.layer添加动画,展示图片更换的效果. 实现 在storyboard添加三个UIImageView,用来展示图片.而数组imageArray则用来保存图片对象. @interface ViewController () @property (strong, nonatomic) IBOutlet UIImageView *midd

  • iOS手势密码的实现方法

    本次讲的手势密码,是在九个按键上实现的,这里讲的是手势密码的基本实现和效果 同样先上效果图 其实就是对画图功能的一个实现,再加上手势操作结合起来. 屏幕宽度高度,方便下面操作,不做解释 #define ScreenHeight [[UIScreen mainScreen] bounds].size.height #define ScreenWidth [[UIScreen mainScreen] bounds].size.width 控制器.m文件 这里的imageView是用来装手势画图之后的

  • iOS手势的实现方法

    本文实例为大家分享了iOS手势的具体实现代码,供大家参考,具体内容如下 效果 细节 1.UITouch #import "ViewController_0.h" @interface ViewController_0 () @property (nonatomic, strong)UILabel *label; @end @implementation ViewController_0 - (void)viewDidLoad { [super viewDidLoad]; self.la

  • IOS中各种手势操作实例代码

    先看下效果 手势相关的介绍 IOS中手势操作一般是 UIGestureRecognizer 类的几个手势子类去实现,一般我们用到的手势就这么5种: 1.点击  UITapGestureRecognizer 2.平移  UIPanGestureRecognizer 3.缩放  UIPinchGestureRecognizer 4.旋转  UIRotationGestureRecognizer 5.轻扫  UISwipeGestureRecognizer 我们上面这个实例中就用到了上面这5种手势,不

  • IOS 单击手势的添加实现代码

    IOS 单击手势的添加实现代码 一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIViewController <UIGestureRecognizerDelegate> @end RootViewController.m #import "RootViewController.h" @interface RootV

  • 基于JS实现Android,iOS一个手势动画效果

    废话不多说了,先给大家展示下效果图: 这是iOS下的效果,android下完全一致.通过do_GestureView组件和do_Animation组件,deviceone能很容易实现复杂的跨平台纯原生动画效果,这个示例就是通过手势控制图片上下动画滑动实现开合效果,还支持声音效果. 下面是主要的代码 //index.ui.js var do_Animator1 = mm("do_Animator"); do_Animator1.append(500, { y: -1334, curve:

  • iOS轻点、触摸和手势代码开发

    一.响应者链 以UIResponder作为超类的任何类都是响应者.UIView和UIControl是UIReponder的子类,因此所有视图和所有控件都是响应者. 1.初始相应器 事件首先会传递给UIApplication对象,接下来会传递给应用程序的UIWindow,UIWindow会选择一个初始相应器来处理事件.初始响应器会选择下面的方式选择1.对于触摸事件,UIWindow会确定用户触摸的视图,然后将事件交给注册了这个视图的手势识别器或则注册视图层级更高的手势识别器.只要存在能处理事件的识

  • JS触摸与手势事件详解

    本文为大家分享了JS触摸与手势事件,供大家参考,具体内容如下 1.触摸事件 包含 iOS 2.0 软件的 iPhone 3G 发布时,也包含了一个新版本的 Safari 浏览器.这款新的移动 Safari提供了一些与触摸(touch)操作相关的新事件.后来,Android 上的浏览器也实现了相同的事件.触摸事件会在用户手指放在屏幕上面时.在屏幕上滑动时或从屏幕上移开时触发.具体来说,有以下几个触摸事件. touchstart :当手指触摸屏幕时触发:即使已经有一个手指放在了屏幕上也会触发. to

  • IOS 开发之swift中手势的实例详解

    IOS 开发之swift中手势的实例详解 手势操作主要包括如下几类 手势 属性 说明 点击 UITapGestureRecognizer numberOfTapsRequired:点击的次数:numberOfTouchesRequired:点击时有手指数量 设置属性 numberOfTapsRequired 可以实现单击,或双击的效果 滑动 UISwipeGestureRecognizer direction:滑动方向 direction 滑动方向分为上Up.下Down.左Left.右Right

  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了iOS实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下 Demo下载地址:手势解锁 效果图: 核心代码: // // ClockView.m // 手势解锁 // // Created by llkj on 2017/8/24. // Copyright © 2017年 LayneCheung. All rights reserved. // #import "ClockView.h" @interface ClockView () //存放当前选中的按钮

  • iOS UIScrollView和控制器返回手势冲突解决方法

    开发中,有部分UI,会将UIScrollView横向铺在底层,上面放tableView 或一些视图左右滚动切换,底层的scrollView会和Nav ViewController原有的返回手势冲突 解决办法,重写UIScrollView 的gestureRecognizerShouldBegin,在ScrollView滚动到头的时候,屏蔽ScrollView的手势 class GesturesConflictScrollView: UIScrollView { override func ges

  • iOS客户端本地推送实现代码

    本文实例为大家分享了iOS本地推送的具体代码,供大家参考,具体内容如下 首先创建全局的本地通知对象及弹出框 // 弹出本地消息 @property(nonatomic,strong)UILocalNotification *localNotification; @property(nonatomic,strong)UIAlertController *alertcontrol; 其次在代码中实现如下: - (void)application:(UIApplication *)applicatio

  • iOS二维码的生成代码

    本文实例为大家分享了iOS二维码的生成代码,供大家参考,具体内容如下 一.工程图. 二.代码. ViewController.m #import "ViewController.h" #import "ScanViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // D

  • iOS 增加右侧按钮功能实例代码

    一,工程图. 二,代码. ViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //增加右侧按钮 [self addRightButton]; } #pragma -mark -functions //增加右侧按钮 -(void)addRightButton { UIBarButtonI

  • iOS字体抖动动画的实现代码

    本文实例为大家分享了iOS字体抖动的具体实现代码,供大家参考,具体内容如下 一.效果图 二.代码 ViewController.m #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the

随机推荐