DesignModeler GestureRecgin…

简介:
DesignModeler : 设计模式     GestureRecginzer:手势识别
作者:韩俊强
1、第一种设计模式
DelegateViewController.m
- (void)viewDidLoad {
    [super viewDidLoad];
    //改变自身颜色
   
 ActionView *redView = [[ActionView alloc]initWithFrame:CGRectMake(20, 20, 280, 100)];
    redView.
tag = 101;
   [ redView
 addTarget:self action:@selector(changeselfBackground :)];
    redView.
backgroundColor = [UIColor randomClolor];
    [
self.view addSubview:redView];
    [redView release];}
#pragma mark --Target....action 设计模式的方法实现
//改变自身颜色
- (void)changeselfBackground : (ActionView *)view{
    view.backgroundColor = [UIColor randomClolor]; 
}
ActionView.h 
@interface ActionView : UIView
//给外界提供一个接口(方法),用来给ActionView 制定事件的响应对象(目标 target),以及target目标响应的方法
- (
void)addTarget : (id)target action:(SEL)action;
@end
ActionView.m
@interface ActionView ()
{
   
 id _target;//存储传入的响应对象
   
 SEL _action;//存储响应对象执行的方法

}
@end
@implementation ActionView
 ActionView 是自定义的视图,我们想把它封装成完成的类,一个完整的类,就是无论你再有什么样的需求,都无需去修改它的源文件
 以前的处理方式不够灵活,因为ActionView创建的对象没接到触摸消息,都要自己去处理事件,所以每创建一个对象,提出一个新的需求都要区修改它的源文件,此时ActionView对象和事件就捆绑到一起了,此时耦合性太强
 通过target ...action设计模式,将事件交由其他对象处理,让我们的ActionView像UIButton一样灵活,此时它只需负责通过目标干活就可以了,此时的ActionView对象和事件就不再捆绑到一起了,耦合性降低了,内聚就升高了
- (void)addTarget : (id)target action:(SEL)action{
   
 //此时在这个方法中要把外界传进来的目标对象,和目标对象要执行的方法存储起来
   
 _target = target;
   
 _action = action;
}
- (
void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
//开始触摸,当ActionView 对象接受到触摸事件的时候,自己不处理事件,需要由_target 来处理
 //目标选择方法去为self执行事件,而且方法中如果有参数,参数就指的是addTarget ...action 方法的调用
    [_target performSelector:_action withObject:self];
DesignModeler <wbr>GestureRecginzer <wbr>UI_05

}===================================================
2、第二种模式  使用代理和设计模式,完成touchView的触摸事件的响应操作,其实就是通过这种方式解除 事件和touchView的耦合
 使用代理和协议步骤:
 1.制订协议(代理要完成的任务)
 2.定义代理属性(存储代理对象)
 3.在其他文件中指定touchView的代理对象 (帮touchView干活)
 4.让代理对象服从协议(代理对象答应帮touchView)干活
 5.让代理对象实现协议中的方法(代理对象知道怎么去干活)
 6.委托人通知代理对象什么时候执行协议中的方法(通知代理去干活)
TouchView.h
//第一步:制定协议
@class TouchView;
@protocol TouchViewDelegate <</span>NSObject>
@optional
//刚开始触摸的时候让代理对象完成这个方法
- (void)touchBeganWithTouchView : (TouchView *)touchView;
@end
@interface TouchView : UIView
//第二步:第一代理属性
@end
————————————————————————————
TouchView.m

@implementation TouchView
- (
void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
   
 //第六步:让代理对象干活
   
 if ([_delegate respondsToSelector:@selector(touchBeganWithTouchView:)]) {
        [_delegate touchBeganWithTouchView:self];}}
 ————————————————————————————  
DelegateViewController.m  
//第四步:让代理对象遵循协议
@interface DelegateViewController ()<</span>TouchViewDelegate>
@end
@implementation DelegateViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor yellowColor];
    TouchView *redView = [[TouchView alloc]initWithFrame:CGRectMake(20, 30, 280, 100)];
    redView.backgroundColor = [UIColor redColor];
    //第三步:指定代理对象
    redView.delegate = self;
    [self.view addSubview:redView];
    [redView release];
}
//第五步:实现协议中的方法
- (void)touchBeganWithTouchView:(TouchView *)touchView{
    touchView.backgroundColor = [UIColor randomClolor];//随机颜色自己做一下封装

======================================================================
3、GestureRecginzer:手势识别
AppDelegate.m
GestureViewController  *gesture = [[ GestureViewController alloc ] init ];
     self . window . rootViewController  = gesture;
    [gesture release];
——————————————————————
封装颜色随机值文件下载 http://pan.baidu.com/s/1gdm6JEb
GestureViewController.m
#import  "GestureViewController.h"
#import "UIColor+RandomColor.h"
- ( void )viewDidLoad {
    [super viewDidLoad];
     self . view . backgroundColor  = [ UIColor  colorWithPatternImage :[ UIImage imageNamed : @"444.jpg" ]];
   // UIGestureRecognizer 手势识别器的基类 ,拓为我们提供了手势识别器的一些基本的功能,我们在屏幕上的手势全部由手势识别器来完成识别,此时我们只需要关心手势识别之后应该做出什么处理 ,它由6大子类,还有一个孙子类(屏幕边缘手势,是平移手势的子类)
  
 
  UIView  *redView = [[ UIView  alloc ] initWithFrame : CGRectMake ( 0 ,  20 ,  320 ,  500 )];
    redView.
backgroundColor  = [ UIColor  redColor ];
    [
self . view  addSubview :redView];
    [redView release];
————————————————————————————
1、轻拍手势
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleTap :)];
    //配置属性
    //设置轻拍手势触发时间所需的轻拍次数
    tapGesture.numberOfTapsRequired = 1;//默认为1下
    //设置轻拍需要的手指对象个数
    tapGesture.numberOfTouchesRequired = 2;
    //给redView添加轻拍的手势对象
    [redView addGestureRecognizer:tapGesture];
    [tapGesture release];
DesignModeler <wbr>GestureRecginzer <wbr>UI_05

#pragma mark 轻拍手势的方法实现
- (void)handleTap : (UITapGestureRecognizer *)tapGesture{
     tapGesture.view.backgroundColor = [UIColor randomClolor];}
————————————————————————————————————————
2、长按手势 UILongPressGestureRecognizer  
    UILongPressGestureRecognizer *longGesture = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(handleLongPress :)];
    //设置长按手势最小多长时间触发方法
    longGesture.minimumPressDuration = 1;//默认为.05秒
    //在视图上添加手势对象
    [redView addGestureRecognizer:longGesture];
    //释放
    [longGesture release];


#pragma mark   长按手势方法实现
- (void) handleLongPress : (UILongPressGestureRecognizer *)longPress{
   
 //改变手势所在视图的父视图的颜色
   
 //根据手势状态,选择执行相应操作
   
 if (longPress.state == UIGestureRecognizerStateBegan) {
            longPress.
view.superview.backgroundColor = [UIColor randomClolor];
    }
}
————————————————————————
3、轻扫手势 UISwipeGestureRecognizer   
     UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]initWithTarget:selfaction:@selector(handleSwipe:)];
  
 //设置轻扫的方向
    swipeGesture.
direction  UISwipeGestureRecognizerDirectionRight;
    [redView
 addGestureRecognizer:swipeGesture];
    [swipeGesture release];
DesignModeler <wbr>GestureRecginzer <wbr>UI_05

#pragma mark  轻扫手势方法的实现
- (void)handleSwipe: (UISwipeGestureRecognizer *)swipeGesture{
    swipeGesture.
view.backgroundColor = [UIColor randomClolor];
}
————————————————————————-
4、平移手势UIPanGestureRecognizer   
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc]initWithTarget:selfaction:@selector(handlePan : )];
    [redView
 addGestureRecognizer:panGesture];
    [panGesture release];
 #pragma mark  平移手势方法的实现
- (void)handlePan : (UIPanGestureRecognizer *)panGesture{
   
 //1.获取平移增量
   
 CGPoint point = [panGesture translationInView:panGesture.view];
   
 //2.仿射变换(变形)
   
 //第一个参数:变形之前的视图位置和大小
   
 //第二个参数:x轴上的形变量(x轴上的增量)
   
 //第三个参数:y轴上的形变量(y轴上的增量)

    panGesture.
view.transform = CGAffineTransformTranslate(panGesture.view.transform,point.x, point.y);
   
 //3.将之前的增量清0;
   
 //CGPointZero  代表{0,0}点     CGPointMake(0,0);
    [panGesture setTranslation:CGPointZero inView:panGesture.view];
————————————————————————————————
5、捏合手势   UIPinchGestureRecognizer  
    UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc]initWithTarget:selfaction:@selector(handlePinch :)];
    [redView addGestureRecognizer:pinchGesture];
    [pinchGesture release];
}
DesignModeler <wbr>GestureRecginzer <wbr>UI_05

 #pragma mark  捏合手势方法的实现
- (void)handlePinch : (UIPinchGestureRecognizer *)pinchGesture{
    pinchGesture.
view.transform = CGAffineTransformScale(pinchGesture.view.transform, pinchGesture.scale, pinchGesture.scale);
   
 //scale 缩放比例
   
 //将之前的形变量置为1
    pinchGesture.
scale = 1;
}
————————————————————————————————
6.旋转手势  UIRotationGestureRecognizer 
    UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizeralloc]initWithTarget:self action:@selector(handleRotationGesture : )];
    [redView addGestureRecognizer:rotationGesture];
    [rotationGesture release];
DesignModeler <wbr>GestureRecginzer <wbr>UI_05

 #pragma mark  旋转手势方法的实现
- (void)handleRotationGesture : (UIRotationGestureRecognizer *)RotationResture{
    RotationResture.
view.transform = CGAffineTransformRotate(RotationResture.view.transform, RotationResture.rotation);
   
 //将之前的角度增量置为0
    RotationResture.
rotation = 0;
}
——————————————————————————————
7.屏幕边缘手势UIScreenEdgePanGestureRecognizer 
    //屏幕边缘的手势必须和硬件设备的边缘重合,此时这个手势才有作用
   
 UIScreenEdgePanGestureRecognizer *screenGesture = [[UIScreenEdgePanGestureRecognizeralloc]initWithTarget:self action:@selector(handleScreenGesture: )];
    //设置屏幕的边缘
    screenGesture.edges = UIRectEdgeLeft;
    [redView
 addGestureRecognizer:screenGesture];
    [screenGesture release];
DesignModeler <wbr>GestureRecginzer <wbr>UI_05
 #pragma mark  屏幕边缘手势方法的实现
- (void) handleScreenGesture : (UIScreenEdgePanGestureRecognizer *)screen{
   
 NSLog(@"小样你能行吗?");
    }
=================================================
欢迎学习本文,未经博主允许,禁止转载!
相关文章
|
搜索推荐 前端开发 Java
在docker上编译openjdk8
在docker容器中编译openjdk源码,构建新的jdk
858 0
在docker上编译openjdk8
el-input el-select调整字体及内边距
1. 背景 el-input输入框默认提供的字体较小,且内边距较大。 这是为了提供统一的样式和好看的外观。 在某些情况下,我们希望使用较大的字体,且让输入框的内边距小一些以便容纳更多东西。
3043 0
|
Oracle 关系型数据库 数据库
OceanBase数据库常见问题之租户创建后想要改字符集如何解决
OceanBase 是一款由阿里巴巴集团研发的企业级分布式关系型数据库,它具有高可用、高性能、可水平扩展等特点。以下是OceanBase 数据库使用过程中可能遇到的一些常见问题及其解答的汇总,以帮助用户更好地理解和使用这款数据库产品。
|
Windows
windows命令行查找修改文件
windows命令行查找修改文件
351 0
|
Android开发 容器 缓存
Android Camera2使用
1. 相机使用流程 图1.jpg 2. SurfaceView /** * Android 5.0 使用Camera2 照相 * 使用SurfaceView显示 * 主要步骤: * 1.
1797 0
|
10月前
|
缓存 自然语言处理 算法
大模型意图识别工程化实践
本文重点介绍大模型意图识别能力在智能电视核心链路中的落地过程和思考,对比了基础模型、RAG 、以及7b模型微调三种方案的优缺点。
4635 121
|
SQL 算法 关系型数据库
(二十)MySQL特性篇:2022年的我们,必须要懂的那些数据库新技术!
 MySQL数据库从1995年诞生至今,已经过去了二十多个年头了,到2022.04.26日为止,MySQL8.0.29正式发行了GA版本,在此之前版本也发生了多次迭代,发行了大大小小N多个版本,其中每个版本中都有各自的新特性,所有版本的特性加起来,用一本书的篇幅也无法完全阐述清楚,因此本章主要会挑重点特性来讲,具体各版本的特性可参考MySQL官网的开发手册。
529 1
|
中间件
比传统事务快10倍?一张图读懂阿里云全局事务服务GTS
近日,阿里云全局事务服务GTS正式上线,为微服务架构中的分布式事务提供一站式解决方案。GTS有哪些功能,相比传统事务的优势在哪呢?我们通过一张图读懂GTS。
4552 81
|
XML API 数据格式
QXmlStreamReader和QXmlStreamWriter实现将一个xml文件读取后保存为另一个xml
QXmlStreamReader和QXmlStreamWriter实现将一个xml文件读取后保存为另一个xml