1> target / action 设计模式 : target ['tɑːgɪt]
        1>什么是耦合 :
  • 耦合是衡量一个程序呢写的好坏的标准之一
  • 耦合是衡量模块与模块之间关联程度的指标
  • 高内聚,低耦合是面向对象编程的核心思想
  • 是用target /action 实现解耦  也是需要让目标去执行一个动作的地方; 代理设计模式也可以实现解耦
  • 高内聚低耦合,是软件工程中的概念,是判断设计好坏的标准,主要是面向对象的设计,主要是看类的内聚性是否高,耦合度是否低。
  • 内聚就是一个模块内各个元素彼此结合的紧密程度,高内聚就是一个模块内各个元素彼此结合的紧密程度高。
    所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。
    耦合:一个软件结构内不同模块之间互连程度的度量(耦合性也叫块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以及传递的信息。)
    对于低耦合,粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能 的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。这样有利于修 改和组合。[1]
  • 耦合性与内聚性是模块独立性的两个定性标准,将软件系统划分模块时,尽量做到高内聚低耦合,提高模块的独立性,为设计高质量的软件结构奠定基础。
     
        有个例子很容易明白:一个程序有50个函数,这个程序执行得非常好;然而一旦你修改其中一个函数,其他49个函数都需要做修改,这就是高耦合的后果。
    一旦你理解了它,你编写概要设计的时候设计类或者模块自然会考虑到“高内聚,低耦合”。
  • 耦合性分类(低――高): 无直接耦合;数据耦合;标记耦合;控制耦合;公共耦合;内容耦合;
 
例题1>如果想点击按钮view(不是按钮)时打印一句good ,和点击 colorView 实现变色,要求用target/ action 方法 ———————> 实现步骤总结
  • 1>先创建一个自定义视图控制器RRViewController 类 和三个 view类( RRView ,ButtonView,CotrolView )
  • 2>先在Appdelegate.m文件中导入RRViewController.h 头文件, 然后在Appdelegate.m 文件中将自定义的视图控制器代替window的根视图控制器 具体步骤如下  以下是固定写法
  • a >创建window
self.window = [ [ UIWindow  alloc ]  initWithFrame:[ [ UIScreen  mainScreen ] bounds] ];
  • b > 给window 添加背景颜色
self.window.backgroundColor =  [ UIColor  whiteColor ] ;
  • c >显示window 窗口
[self.window  makeKeyAndVisible ];  visible [ˈvɪzəbl] ——.>明显的,看得见的
  • d>创建自定义视图控制器 
RRViewContronller  *RRVC =[ [RRViewController  alloc ] init ] ;
  • e>将我们创建的视图控制器,替换掉我们window的跟视图控制器
self.window.rootViewController = RRVC;
  • 3>在RRViewController.m 中导入 RRVIew.h ; 在延展声明中 ,声明RRView类的实例化变量 ,然后在@implementation RRViewController 里面 写我们视图控制器的初始化方法(固定写法) 再将我们的声明的RRView 的视图替换掉 控制器自身带的view 视图,此步骤要在 重写加载图片方法中写-(void) loadView;  步骤如下
  • a>在类的延展中声明类的实例化变量
@interface RRViewController ()  
@property(nonatomic,retain) RRView *rrview;
@end
  • b>在@implementation RRViewController 里面写控制器的初始化方法
-(instancetype ) initWithNibName:(NSString * ) nibNameOrNil bundle :(NSBundle * )nibBundleOrnil
{
self = [super initWithName:nibNameOrNil bundle : nibBundleOrNil ] ;
if(self)
{
_rrview = [ [ RRView alloc ] initWithFrame : [ [ UIScreen mainScreen ] bounds] ] ;
}
return self ;
}
-(void ) loadView
{
self.view = _rrview;
}
-(void)myAddTarget:(id)target action:(SEL) action;
是我们在ButtonView中定义的一个方法
(4)参数self是controller本身,将controller本身传过去
(5)参数@selector(bvAction:)是用方法选择器将bvAvtion方法传过去。
—————> 模拟target / action 方法 
@interface ButtonView : UIView
/*
{
 //目标实例变量
 id _target;
 //事件实例变量
 SEL _action;
 
 }
*/

//添加点击事件
//点击view的时候,view要响应(target) 的那个方法(action )
//上边是为了保存传进来的实例变量

@property(nonatomic,assign) id target;

@property(nonatomic,assign) SEL action;

-(void)myAddTarget:(id)target action:(SEL) action;

@end
 
#import "ButtonView.h"

@implementation ButtonView

//添加点击事件
-(void)myAddTarget:(id)target action:(SEL) action
{
    _target = target;
   
    _action = action;

}
//当触摸开始时,会执行touchBegan 方法
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//把在控制器里面写的方法和他 联系起来
    //触摸事件发生后 ,用target 去调用传进来的action 方法
    //内存泄露
    //当触摸事件发生时,视图会执行touchebegan方法
    //给target发消息,即action

    [_target performSelector:_action  withObject:self];
  
}

@end
具体步骤 见下代码
 
二>代理设计模式
什么是代理设计模式:当一个类的某些功能需要被别人来实现,但是既不明确是些什么功能,又不明确随来实现这些功能的时候,委托模式就可以派上用场了 ———> 目的是为了降低类之间的耦合性
1>如何用delegate实现解耦?
  • delegate也是用来解耦的,它不再简简单单让目标去执行一个动作了
  • 而是delegate去处理一些列事件 ,就像UITextFieldDelegate一样,能监测将要开始编辑,已经开始编辑,return 按钮点击..
2>delegate 是用的场景
  • 控件有一些列时间点,控制器可以实现这个代理方法,以便在适当的时机做适当的事.
例题 通过改变点击view 则改变颜色  大致步骤如下
a> 先创建window窗口
b>建一个自定义视图控制器 去替代window的根视图控制器
c> 创建一个view ,代替自定义里面的view视图
d> 创建第二个view ,这个view 遵循这个协议 ,并实例化一个delegate对象,再实现文件里必须用触摸开始的方法( -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event )在这里面实现这个协议里方法, 这样才能在视图控制器里实现点击控制
e> 最后让我们的视图控制器的实现文件也遵循这个协议,在视图加载完毕方法中(viewDidLoad)设置代理也就是让视图控制器做这个代理,让它去实现这个方法 , 另外实现这个协议里面的方法;
具体代码如下;
 
三 >UIImageView 
————.>什么是UIImageView?
  • UIImageView 是iOS中用于显示图片的类 ,iOS中几乎所有看到的图片,都是由这个类来显示的.
—————>是用UIImageView显示图片
  • 使用initWithImage : 方法 ,创建UIImageView对象
UIImageView * imageView  = [[ UIImageView alloc  ] initWIthImage :[ UIImage  imageNamed:@“1234.gif" ] ];
imageView.frame = [[UIScreen  mainScreen ] bounds ] ;
[self addSubview :_imageview ] ;
  • 使用 initWIthContentOfFile : 方法,创建一个UIImage 对象
  • ImageView的默认是NO,是关闭交互。要将userInteractionEnabled(响应者链是否交互)设置为YES
    self.img.userInteractionEnabled = YES;

// 设置图片连续播放,实现动画效果

oneImageView.animationImages = [NSArray arrayWithObjects:[UIImage imageNamed:@"max.png"], [UIImage imageNamed:@"min.png"], nil];

oneImageView.animationDuration = 0.3f; // 设置循环一次的时间

oneImageView.animationRepeatCount = 0; // 循环的次数。设置为0时无线循环

[oneImageView startAnimating]; // 开始动画

 
    // [oneImageView stopAnimating]; // 停止动画
 

// 获取网络中的图片

UIImage *urlImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.baidu.com"]]];

 
四> 手势识别器
—————> 什么是手势识别器
  • 手势识别器是对触摸事件做了封装,,我们无需自己去判断某个手势是否触发,手势识别器本身就起到了识别作用,我们把重心放在识别之后要做什么操作上面
  • 手势识别器是ios中比较抽象的一个类,用于识别一个手势,所谓手势 : 有规律的触摸
  • 手势识别器的分类: 分别识别轻拍手势,平移手势,清扫手势缩放手势,旋转手势 ,长按手势 以及屏幕边界平移手势
  • 一旦指定的手势被识别,我们可以执行我们自己定义好的的操作
  • @property(nonatomic,retain) UIImageView *imageView;
  • _imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"123.gif"]];
       
        _imageView.frame =[[UIScreen mainScreen] bounds];
       
        [self addSubview:_imageView];
  • 然后完成下面的操作
UITapGestureRecognizer  是轻拍手势识别器,能识别轻拍操作
//第一种
    //轻拍手势
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)];
    //添加到视图上gesture ['dʒestʃə] 手势 ;  recognizer ['rekəg,naizə] 识别器
    [_imageView addGestureRecognizer:tap];
    //1>设置了用几个手指点击 一般把这两个属性需要的时候写,会影响 旋转,平移,等触摸操作
    //tap.numberOfTouchesRequired = 1;
    //2>点击多少次才能起到效果(也就是真正的点击了)
    //tap.numberOfTapsRequired = 3;
 对应的方法 : //轻拍
-(void)tapAction
{

NSLog(@"轻拍了!!!!");

}
UILongPressGestureRecognizer  是长按⼿手势识别器,能识别⻓长按操作。
//第二种(长按)
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress)];
    //将手势识别类型添加到视图上
    [_imageView addGestureRecognizer:longPress];
方法: //长按
-(void)longPress
{

NSLog(@"常按了~~~~~");

}
UIRotationGestureRecognizer 是旋转手势识别器,能识别旋转操作。
//第三种 (旋转)
    UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotation:)];
    [_imageView addGestureRecognizer:rotation];
    [_imageView1 addGestureRecognizer:rotation];
方法: //旋转
-(void)rotation:(UIRotationGestureRecognizer *)sender
{
    NSLog(@"旋转啦 ==");//   transform [træns'fɔːm; trɑːns-; -nz-]  变换 ,改变
    _imageView.transform = CGAffineTransformRotate(_imageView.transform, sender.rotation);
    sender.rotation = 0.5;//旋转的速度 越大越快
 
   
}
UIPinchGestureRecognizer 是捏合手势识别器,能识别捏合操作。
//第四种 (捏合)
    UIPinchGestureRecognizer * pinch =[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
   
    [_imageView addGestureRecognizer:pinch];
方法: //捏合
-(void)pinch:(UIPinchGestureRecognizer *)sender
{
    NSLog(@"捏合");//scale [skeɪl] 比例
   
    _imageView.transform = CGAffineTransformScale(_imageView.transform, sender.scale, sender.scale);
    sender.scale = 1;
   
   
   
}
UIPanGestureRecognizer 是平移手势识别器,能识别拖拽操作。
//第七种 平移
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
    [_imageView addGestureRecognizer:pan];
方法: //屏幕 平移
-(void)pan:(UIPanGestureRecognizer *)sender
{
    CGPoint point = [sender translationInView:_imageView];
    self.imageView.transform = CGAffineTransformTranslate(_imageView.transform, point.x, point.y);
    [sender setTranslation:CGPointZero inView:_imageView];

}
   
UISwipeGestureRecognizer 是轻扫手势识别器,能识别拖拽操作。
 
 //第五种 (轻扫)
    UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
   
    [_imageView addGestureRecognizer:swipe];
    // 以下是设置滑动的方向
   
    // typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
   
    //    UISwipeGestureRecognizerDirectionRight = 1 << 0, // 从左向右滑动
   
    //    UISwipeGestureRecognizerDirectionLeft  = 1 << 1, // 从右向左滑动
   
    //    UISwipeGestureRecognizerDirectionUp    = 1 << 2, // 从下向上滑动
   
    //    UISwipeGestureRecognizerDirectionDown  = 1 << 3  // 从上向下滑动
 
方法; //清扫
-(void)swipe:(UISwipeGestureRecognizer *)sender
{
    NSLog(@"轻扫");
    sender.view.transform = CGAffineTransformScale(sender.view.transform, 1, 1);//scale [skeɪl] 规模
    [sender setDirection:1];
   
   
}
   
UIScreenEdgePanGestureRecognizer 是屏幕边缘轻扫识别器,是 iOS7 中新增的⼿手势。
 
 
 //第六种 (屏幕边缘) Screen Edge  屏幕的边缘
    UIScreenEdgePanGestureRecognizer *screen = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(screen:)];
    [_imageView addGestureRecognizer:screen];
 
方法: //屏幕边缘
-(void)screen:(UIScreenEdgePanGestureRecognizer *)sender
{
  
    NSLog(@"屏幕边缘的");
    CGPoint point = [sender translationInView:sender.view];
    sender.view.transform = CGAffineTransformTranslate(sender.view.transform, point.x, 0);
    [sender setTranslation:CGPointZero inView:sender.view];
   
   
}
—————>如何使用识别器
  • 我们不会直接使用手势识别器这个抽象父类,而是根据需要使用特定的手势识别器创建对象
  • 1>创建UIxxxGesturnRecognizer 对象,使用initWithTarget:action : 方法
  • 配置要识别的手势的相关信息
  • 将手势添加到某个视图上
  • 实现手势识别器里定义的方法
————>view 的 transform 属性
  • transform 是view的一个重要属性 ,它在矩形层面上改变view的显示状态,能实现view的缩放,旋转,平移等功能
————>总结 :
  • target …action 和delegate 是很重要的设计模式,务必理解原理以及熟练使用
  • 手势识别器是很常用的类,在日常开发中经常使用,需要牢记每个手势识别器的特点以及注意事项
  • transform 是view的重要属性 ,在屏幕旋转方面用的比较多
 
扩展来回切换图片
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
//{
//    NSLog(@"开始");
//   
//   
//   //来回切
//    if([_imageView superview])
//    {
//     [_imageView removeFromSuperview];
//        self.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0  blue:arc4random()%256/255.0  alpha:1];
//       
//   
//    }else
//    {
//   
//        [self addSubview:_imageView];
//    }
//   
具体如下
 
1> target / action 设计模式 : target ['tɑːgɪt]
        1>什么是耦合 :
  • 耦合是衡量一个程序呢写的好坏的标准之一
  • 耦合是衡量模块与模块之间关联程度的指标
  • 高内聚,低耦合是面向对象编程的核心思想
  • 是用target /action 实现解耦  也是需要让目标去执行一个动作的地方; 代理设计模式也可以实现解耦
  • 高内聚低耦合,是软件工程中的概念,是判断设计好坏的标准,主要是面向对象的设计,主要是看类的内聚性是否高,耦合度是否低。
  • 内聚就是一个模块内各个元素彼此结合的紧密程度,高内聚就是一个模块内各个元素彼此结合的紧密程度高。
    所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。
    耦合:一个软件结构内不同模块之间互连程度的度量(耦合性也叫块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以及传递的信息。)
    对于低耦合,粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能 的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。这样有利于修 改和组合。[1]
  • 耦合性与内聚性是模块独立性的两个定性标准,将软件系统划分模块时,尽量做到高内聚低耦合,提高模块的独立性,为设计高质量的软件结构奠定基础。
     
        有个例子很容易明白:一个程序有50个函数,这个程序执行得非常好;然而一旦你修改其中一个函数,其他49个函数都需要做修改,这就是高耦合的后果。
    一旦你理解了它,你编写概要设计的时候设计类或者模块自然会考虑到“高内聚,低耦合”。
  • 耦合性分类(低――高): 无直接耦合;数据耦合;标记耦合;控制耦合;公共耦合;内容耦合;
 
例题1>如果想点击按钮view(不是按钮)时打印一句good ,和点击 colorView 实现变色,要求用target/ action 方法 ———————> 实现步骤总结
  • 1>先创建一个自定义视图控制器RRViewController 类 和三个 view类( RRView ,ButtonView,CotrolView )
  • 2>先在Appdelegate.m文件中导入RRViewController.h 头文件, 然后在Appdelegate.m 文件中将自定义的视图控制器代替window的根视图控制器 具体步骤如下  以下是固定写法
  • a >创建window
self.window = [ [ UIWindow  alloc ]  initWithFrame:[ [ UIScreen  mainScreen ] bounds] ];
  • b > 给window 添加背景颜色
self.window.backgroundColor =  [ UIColor  whiteColor ] ;
  • c >显示window 窗口
[self.window  makeKeyAndVisible ];  visible [ˈvɪzəbl] ——.>明显的,看得见的
  • d>创建自定义视图控制器 
RRViewContronller  *RRVC =[ [RRViewController  alloc ] init ] ;
  • e>将我们创建的视图控制器,替换掉我们window的跟视图控制器
self.window.rootViewController = RRVC;
  • 3>在RRViewController.m 中导入 RRVIew.h ; 在延展声明中 ,声明RRView类的实例化变量 ,然后在@implementation RRViewController 里面 写我们视图控制器的初始化方法(固定写法) 再将我们的声明的RRView 的视图替换掉 控制器自身带的view 视图,此步骤要在 重写加载图片方法中写-(void) loadView;  步骤如下
  • a>在类的延展中声明类的实例化变量
@interface RRViewController ()  
@property(nonatomic,retain) RRView *rrview;
@end
  • b>在@implementation RRViewController 里面写控制器的初始化方法
-(instancetype ) initWithNibName:(NSString * ) nibNameOrNil bundle :(NSBundle * )nibBundleOrnil
{
self = [super initWithName:nibNameOrNil bundle : nibBundleOrNil ] ;
if(self)
{
_rrview = [ [ RRView alloc ] initWithFrame : [ [ UIScreen mainScreen ] bounds] ] ;
}
return self ;
}
-(void ) loadView
{
self.view = _rrview;
}
-(void)myAddTarget:(id)target action:(SEL) action;
是我们在ButtonView中定义的一个方法
(4)参数self是controller本身,将controller本身传过去
(5)参数@selector(bvAction:)是用方法选择器将bvAvtion方法传过去。
—————> 模拟target / action 方法 
@interface ButtonView : UIView
/*
{
 //目标实例变量
 id _target;
 //事件实例变量
 SEL _action;
 
 }
*/

//添加点击事件
//点击view的时候,view要响应(target) 的那个方法(action )
//上边是为了保存传进来的实例变量

@property(nonatomic,assign) id target;

@property(nonatomic,assign) SEL action;

-(void)myAddTarget:(id)target action:(SEL) action;

@end
 
#import "ButtonView.h"

@implementation ButtonView

//添加点击事件
-(void)myAddTarget:(id)target action:(SEL) action
{
    _target = target;
   
    _action = action;

}
//当触摸开始时,会执行touchBegan 方法
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//把在控制器里面写的方法和他 联系起来
    //触摸事件发生后 ,用target 去调用传进来的action 方法
    //内存泄露
    //当触摸事件发生时,视图会执行touchebegan方法
    //给target发消息,即action

    [_target performSelector:_action  withObject:self];
  
}

@end
具体步骤 见下代码
 
二>代理设计模式
什么是代理设计模式:当一个类的某些功能需要被别人来实现,但是既不明确是些什么功能,又不明确随来实现这些功能的时候,委托模式就可以派上用场了 ———> 目的是为了降低类之间的耦合性
1>如何用delegate实现解耦?
  • delegate也是用来解耦的,它不再简简单单让目标去执行一个动作了
  • 而是delegate去处理一些列事件 ,就像UITextFieldDelegate一样,能监测将要开始编辑,已经开始编辑,return 按钮点击..
2>delegate 是用的场景
  • 控件有一些列时间点,控制器可以实现这个代理方法,以便在适当的时机做适当的事.
例题 通过改变点击view 则改变颜色  大致步骤如下
a> 先创建window窗口
b>建一个自定义视图控制器 去替代window的根视图控制器
c> 创建一个view ,代替自定义里面的view视图
d> 创建第二个view ,这个view 遵循这个协议 ,并实例化一个delegate对象,再实现文件里必须用触摸开始的方法( -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event )在这里面实现这个协议里方法, 这样才能在视图控制器里实现点击控制
e> 最后让我们的视图控制器的实现文件也遵循这个协议,在视图加载完毕方法中(viewDidLoad)设置代理也就是让视图控制器做这个代理,让它去实现这个方法 , 另外实现这个协议里面的方法;
具体代码如下;
 
三 >UIImageView 
————.>什么是UIImageView?
  • UIImageView 是iOS中用于显示图片的类 ,iOS中几乎所有看到的图片,都是由这个类来显示的.
—————>是用UIImageView显示图片
  • 使用initWithImage : 方法 ,创建UIImageView对象
UIImageView * imageView  = [[ UIImageView alloc  ] initWIthImage :[ UIImage  imageNamed:@“1234.gif" ] ];
imageView.frame = [[UIScreen  mainScreen ] bounds ] ;
[self addSubview :_imageview ] ;
  • 使用 initWIthContentOfFile : 方法,创建一个UIImage 对象
  • ImageView的默认是NO,是关闭交互。要将userInteractionEnabled(响应者链是否交互)设置为YES
    self.img.userInteractionEnabled = YES;

// 设置图片连续播放,实现动画效果

oneImageView.animationImages = [NSArray arrayWithObjects:[UIImage imageNamed:@"max.png"], [UIImage imageNamed:@"min.png"], nil];

oneImageView.animationDuration = 0.3f; // 设置循环一次的时间

oneImageView.animationRepeatCount = 0; // 循环的次数。设置为0时无线循环

[oneImageView startAnimating]; // 开始动画

 
    // [oneImageView stopAnimating]; // 停止动画
 

// 获取网络中的图片

UIImage *urlImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.baidu.com"]]];

 
四> 手势识别器
—————> 什么是手势识别器
  • 手势识别器是对触摸事件做了封装,,我们无需自己去判断某个手势是否触发,手势识别器本身就起到了识别作用,我们把重心放在识别之后要做什么操作上面
  • 手势识别器是ios中比较抽象的一个类,用于识别一个手势,所谓手势 : 有规律的触摸
  • 手势识别器的分类: 分别识别轻拍手势,平移手势,清扫手势缩放手势,旋转手势 ,长按手势 以及屏幕边界平移手势
  • 一旦指定的手势被识别,我们可以执行我们自己定义好的的操作
  • @property(nonatomic,retain) UIImageView *imageView;
  • _imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"123.gif"]];
       
        _imageView.frame =[[UIScreen mainScreen] bounds];
       
        [self addSubview:_imageView];
  • 然后完成下面的操作
UITapGestureRecognizer  是轻拍手势识别器,能识别轻拍操作
//第一种
    //轻拍手势
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)];
    //添加到视图上gesture ['dʒestʃə] 手势 ;  recognizer ['rekəg,naizə] 识别器
    [_imageView addGestureRecognizer:tap];
    //1>设置了用几个手指点击 一般把这两个属性需要的时候写,会影响 旋转,平移,等触摸操作
    //tap.numberOfTouchesRequired = 1;
    //2>点击多少次才能起到效果(也就是真正的点击了)
    //tap.numberOfTapsRequired = 3;
 对应的方法 : //轻拍
-(void)tapAction
{

NSLog(@"轻拍了!!!!");

}
UILongPressGestureRecognizer  是长按⼿手势识别器,能识别⻓长按操作。
//第二种(长按)
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress)];
    //将手势识别类型添加到视图上
    [_imageView addGestureRecognizer:longPress];
方法: //长按
-(void)longPress
{

NSLog(@"常按了~~~~~");

}
UIRotationGestureRecognizer 是旋转手势识别器,能识别旋转操作。
//第三种 (旋转)
    UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotation:)];
    [_imageView addGestureRecognizer:rotation];
    [_imageView1 addGestureRecognizer:rotation];
方法: //旋转
-(void)rotation:(UIRotationGestureRecognizer *)sender
{
    NSLog(@"旋转啦 ==");//   transform [træns'fɔːm; trɑːns-; -nz-]  变换 ,改变
    _imageView.transform = CGAffineTransformRotate(_imageView.transform, sender.rotation);
    sender.rotation = 0.5;//旋转的速度 越大越快
 
   
}
UIPinchGestureRecognizer 是捏合手势识别器,能识别捏合操作。
//第四种 (捏合)
    UIPinchGestureRecognizer * pinch =[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
   
    [_imageView addGestureRecognizer:pinch];
方法: //捏合
-(void)pinch:(UIPinchGestureRecognizer *)sender
{
    NSLog(@"捏合");//scale [skeɪl] 比例
   
    _imageView.transform = CGAffineTransformScale(_imageView.transform, sender.scale, sender.scale);
    sender.scale = 1;
   
   
   
}
UIPanGestureRecognizer 是平移手势识别器,能识别拖拽操作。
//第七种 平移
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
    [_imageView addGestureRecognizer:pan];
方法: //屏幕 平移
-(void)pan:(UIPanGestureRecognizer *)sender
{
    CGPoint point = [sender translationInView:_imageView];
    self.imageView.transform = CGAffineTransformTranslate(_imageView.transform, point.x, point.y);
    [sender setTranslation:CGPointZero inView:_imageView];

}
   
UISwipeGestureRecognizer 是轻扫手势识别器,能识别拖拽操作。
 
 //第五种 (轻扫)
    UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
   
    [_imageView addGestureRecognizer:swipe];
    // 以下是设置滑动的方向
   
    // typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
   
    //    UISwipeGestureRecognizerDirectionRight = 1 << 0, // 从左向右滑动
   
    //    UISwipeGestureRecognizerDirectionLeft  = 1 << 1, // 从右向左滑动
   
    //    UISwipeGestureRecognizerDirectionUp    = 1 << 2, // 从下向上滑动
   
    //    UISwipeGestureRecognizerDirectionDown  = 1 << 3  // 从上向下滑动
 
方法; //清扫
-(void)swipe:(UISwipeGestureRecognizer *)sender
{
    NSLog(@"轻扫");
    sender.view.transform = CGAffineTransformScale(sender.view.transform, 1, 1);//scale [skeɪl] 规模
    [sender setDirection:1];
   
   
}
   
UIScreenEdgePanGestureRecognizer 是屏幕边缘轻扫识别器,是 iOS7 中新增的⼿手势。
 
 
 //第六种 (屏幕边缘) Screen Edge  屏幕的边缘
    UIScreenEdgePanGestureRecognizer *screen = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(screen:)];
    [_imageView addGestureRecognizer:screen];
 
方法: //屏幕边缘
-(void)screen:(UIScreenEdgePanGestureRecognizer *)sender
{
  
    NSLog(@"屏幕边缘的");
    CGPoint point = [sender translationInView:sender.view];
    sender.view.transform = CGAffineTransformTranslate(sender.view.transform, point.x, 0);
    [sender setTranslation:CGPointZero inView:sender.view];
   
   
}
—————>如何使用识别器
  • 我们不会直接使用手势识别器这个抽象父类,而是根据需要使用特定的手势识别器创建对象
  • 1>创建UIxxxGesturnRecognizer 对象,使用initWithTarget:action : 方法
  • 配置要识别的手势的相关信息
  • 将手势添加到某个视图上
  • 实现手势识别器里定义的方法
————>view 的 transform 属性
  • transform 是view的一个重要属性 ,它在矩形层面上改变view的显示状态,能实现view的缩放,旋转,平移等功能
————>总结 :
  • target …action 和delegate 是很重要的设计模式,务必理解原理以及熟练使用
  • 手势识别器是很常用的类,在日常开发中经常使用,需要牢记每个手势识别器的特点以及注意事项
  • transform 是view的重要属性 ,在屏幕旋转方面用的比较多
 
扩展来回切换图片
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
//{
//    NSLog(@"开始");
//   
//   
//   //来回切
//    if([_imageView superview])
//    {
//     [_imageView removeFromSuperview];
//        self.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0  blue:arc4random()%256/255.0  alpha:1];
//       
//   
//    }else
//    {
//   
//        [self addSubview:_imageView];
//    }
//   
 
 
 
 

UI 设计模式 手势识别器的更多相关文章

  1. UI基础:target...action设计模式,手势识别器.UIimageview

    使用target..action和delegate设计模式可以实现解耦.使代码更加优化. 手势识别器: 手势识别器:是对触摸事件做了封装,无需自己去判断某个手势是否触发,手势识别器本身起到了识别作用, ...

  2. iOS开发UI高级手势识别器

    ####手势识别器 UIGestureRecognizer类 ·UITapGestureRecognizer(轻击) ·UIPinchGestureRecognizer(捏合) ·UIPanGestu ...

  3. [iOS UI进阶 - 3.2] 手势识别器UIGestureRecognizer

    A.系统提供的手势识别器   1.敲击手势 UITapGestureRecognizer numberOfTapsRequired: 敲击次数 numberOfTouchesRequired: 同时敲 ...

  4. iOS 七大手势之轻拍,长按,旋转手势识别器方法

    一.监听触摸事件的做法   如果想监听一个view上面的触摸事件,之前的做法通常是:先自定义一个view,然后再实现view的touches方法,在方法内部实现具体处理代码 通过touches方法监听 ...

  5. iOS 触摸事件与手势识别器(Gesture Recognizers)

    Gesture Recognizers与触摸事件分发 通过一个问题引出今天的知识: 1.大家应该都遇见过 当需要给tableView 添加一个tap 手势识别 但是tableView 的上的事件(滑动 ...

  6. iOS 七大手势之轻拍,长按,旋转手势识别器方法-赵小波

    一.监听触摸事件的做法 如果想监听一个view上面的触摸事件,之前的做法通常是:先自定义一个view,然后再实现view的touches方法,在方法内部实现具体处理代码 通过touches方法监听vi ...

  7. iOS 手势识别器(UIGestureRecognizer)

    UIGestureRecognizer是一个抽象类,定义了所有手势的基本行为,使用它的子类才能处理具体的手势. UIGestureRecognizer的子类有: UITapGestureRecogni ...

  8. iOS的触摸事件的用法以及和手势识别器的区别

    1.首先来介绍下触摸事件和手势识别器的利与弊 触摸事件和手势识别器二者之间有直接的关系 手势识别器是在触摸事件的基础上演变过来的 当我们用到触摸事件时 默认的uiview是没有什么效果的 只能自定义v ...

  9. iOS常用手势识别器

    手势识别状态: typedef NS_ENUM(NSInteger, UIGestureRecognizerState) { // 没有触摸事件发生,所有手势识别的默认状态 UIGestureReco ...

随机推荐

  1. win7配置自己的IIS服务器亲自做的图文很详细

    跟人网站爱好初学者必看的win7系统配置自己的IIS,可以在你自己的电脑上配置网站服务器发不到网上,下面就跟着我的步骤一起做吧100%成功. 步骤/方法     点击开始-------控制面板这个就是 ...

  2. 网站运维工具使用iis日志分析工具分析iis日志(iis日志的配置)

    我们只能通过各种系统日志来分析网站的运行状况,对于部署在IIS上的网站来说,IIS日志提供了最有价值的信息,我们可以通过它来分析网站的响应情况,来判断网站是否有性能问题,或者存在哪些需要改进的地方 对 ...

  3. tomcat服务器搭建之ngrok——将内网地址映射到外网

    最近心血来潮,想学习微信公众号开发.但是自己又没有外网服务器,这个给我带来很大的麻烦. 刚开始申请了新浪云服务和百度云服务,将写好的代码打包丢到相应的云服务器上就行. 但问题就来了,开发中避免不了错误 ...

  4. 基于canvas的二维码邀请函生成插件

    去年是最忙碌的一年,实在没时间写博客了,看着互联网行业中一个又一个人的倒下,奉劝大家,健康要放在首位,保重身体.好了,言归正传,这是17年的第一篇博文,话说这天又是产品同学跑过来问我说:hi,lenn ...

  5. jvm的内存空间分区

    在方法(代码块)中定义一个变量时,java就在栈中为这个变量分配JVM内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的JVM内存空间:而在堆中分配的JVM内存由java虚拟机的自动 ...

  6. 基于Quartz.NET框架的WinForm任务计划管理工具

    最近接到一个小需求 ——可以定期同步20个Sql Server 7.0数据库里的数据(数据量会预计>10000),并保存为cvs格式文件 ——可以设置保存文件数据量 ——该应用需要用WinFor ...

  7. BZOJ 2142: 礼物

    模非素数下的排列组合,简直凶残 调着调着就过了= = 都不知道怎么过的= = 直接上链接http://hi.baidu.com/aekdycoin/blog/item/147620832b567eb4 ...

  8. JavaScript内置对象-Object

    ▓▓▓▓▓▓ 大致介绍 JavaScript的简单数据类型包括:Undefined.Null.Boolean.Number.String.JavaScript中这五种基本数据类型不是对象,其他所有值都 ...

  9. Mysql动态sql语句,用当前时间做表名

    在mysql备份操作中, 我们可能要使用表名和当前时间来做为备份表的名称,但是MySQL在存储过程中不支持使用变量名来做表名或者列名. 例如:有一个表"user",我需要备份一份, ...

  10. ConcurrentHashMap源码分析

    看过hashMap源码之后一直意犹未尽的感觉,挡不住我看其他的源码了.HashMap在单线程中非常好用,也不会出现什么问题,但是一到多线程就gg了,变的不灵了.我们有HashTable可以运用在多线程 ...