DesignModeler GestureRecgin…

DesignModeler : 设计模式     GestureRecginzer:手势识别
作者:韩俊强
原创版权地址: http://blog.sina.com.cn/s/blog_814ecfa90102vvm5.html
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];//随机颜色自己做一下封装
} DesignModeler <wbr>GestureRecginzer <wbr>UI_05

======================================================================
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];
DesignModeler <wbr>GestureRecginzer <wbr>UI_05

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

 #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:self action:@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 = [[UIRotationGestureRecognizer alloc]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 = [[UIScreenEdgePanGestureRecognizer alloc]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(@"小样你能行吗?");
    }
=================================================
欢迎学习本文,未经博主允许,禁止转载!

你可能感兴趣的:(DesignModeler GestureRecgin…)