target-action设计模式
iOS设计模式之Target-Action主要是为了降低代码的耦合性。顾名思义 Target-Action模式就是指 目标-动作模式,它贯穿于iOS开发始终。
提到Target-Action,先说2个词 “高内聚,低耦合” 这主要是评价一个软件的好坏
它评判软件的好坏主要靠模板之间内聚是否高,模块间耦合度是否低。
其实Target-action模式很简单,就是当某个事件发生时,调用那个对象中的那个方法。比如:点击按钮时,调用Controller里边的 click方法。“那个对象”就是Target,“那个方法”就是Action,及Controller是Targer,click方法是action。
一般Target都是Controller,而Action有它自己固有的格式:-(IBAction)click:(id)sender。
对于Target-Action模式更加专业点讲,可以这么说:Target-Action是一种当一个事件发生时候,一个对象携带发送一个消息到另一个 对象的必要的信息设计模式。存储的信息包括两类数据:标识所被调用的方法的动作选择器,和一个接收消息的目标。当被称作动作消息的事件发生的时候消息开始 发送。尽管target可以是任何对象,甚至是框架对象,典型代表是以一种应用的特殊方式处理action message的一个自定义控制器。引 发一个动作消息的事件可以是任何事物,比如对象发送消息可以为任何对象一样。举个例子:手势识别对象可能会发送一个动作消息给另一个对象当手势被识别的时 候。然而target-action范例最普遍的发现在控制器例如按钮或者滑动条。当一个用户操作一个控制对象,它发送消息给特殊的对象。控制对象是 UIControl的子类。action selecter和target object都是控制对象的属性。
Target-Action模式主要是在MVC模式中 V--C 之间进行通信的。V(view:视图)只负责发送对应的action给target,并不关心target具体做什么。这样代码的耦合性就松开了。
target/action设计模式
类为委托方
控制器为代理方
方法为协议
//.h文件
#import <UIKit/UIKit.h>
@interface TapView : UIView
@property (nonatomic,assign) id target;
@property (nonatomic,assign) SEL action;
@end
//视图的.m文件
#import "TapView.h"
@implementation TapView
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//这里负责调用
//外界传什么方法,我就执行什么方法,不需要知道方法到底是怎么实现的.
//如果外界的方法有参数,那么这个参数一定是TapView*类型的
[_target performSelector:self.action withObject:self];
}
//根视图控制器控制
//控制器的.m文件
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
TapView *tap1 = [[TapView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
tap1.backgroundColor = [UIColor redColor];
[self.view addSubview:tap1];
tap1.tag = 1001;
tap1.target = self; //target=控制器
tap1.action = @selector(randomColor:);//选择要触发的事件
[tap1 release];
}
代理设计模式
控制有一些是时间点,控制器可以实现这个代理方法,以便在适应的时候做适应的事
对于一些时间点,想让我的代理对象做什么事
//代理设计模式要先写一个协议
//协议名称以类名开头加上Delegate .h文件
@protocol TapViewDelegate <NSObject>
@optional
//当视图刚开始被触摸的时候,代理方要去实现的方法.
- (void)tapViewBegan:(TapView *)tapView;
//当视图在拖动过程中,想要代理方要去实现方式
- (void)tapViewMove:(TapView *)tapView;
//当视图结束触摸的时候,代理方要去实现的方法
- (void)tapViewEnd:(TapView *)tapView;
@end
@interface TapView : UIView
@property (nonatomic,assign) id<TapViewDelegate> detegate; //设计接收协议的代理对象
@end
//.m文件 如果代理不为空,切响应了某个事件 就触发 代理一般用在时间点上
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
if (_detegate != nil && [_detegate respondsToSelector:@selector(tapViewBegan:)])
{
[_detegate tapViewBegan:self];
}
}
UIImageView
//写法1:创建一个图片视图
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"2753441426829430"]];
imageView.frame = self.view.bounds ;
[self.view addSubview:imageView];
//写法2:创建一个gif视图
//如何让UIImageView播放多张图片,GIF动态图
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 150, 350, 350)];
NSMutableArray *imageArray = [[NSMutableArray alloc] initWithCapacity:4];
for (int i = 1; i <= 4; i++)
{
NSString *imageName = [NSString stringWithFormat:@"w12%d.tiff",i];
UIImage *image = [UIImage imageNamed:imageName];
[imageArray addObject:image];
}
imageView.animationImages = imageArray;//指定需要做动画的图片
imageView.animationDuration = 0.5;//设置播放的时间 速率
imageView.animationRepeatCount = 0; //设置循环次数
[self.view addSubview:imageView];
[imageView startAnimating];//让其开始播放
[imageView release];
//写法3:通过图片路径加载图片
//通过文件路径来加载一个图片
UIImageView *imageView1 = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:@"/Users/anhao/Desktop/2753441426829430.png"]];
imageView1.frame = self.view.bounds ;
[self.view addSubview:imageView1];
手势识别器:
手势识别器:是对触摸事件做了封装,无需自己去判断某个手势是否触发,手势识别器本身起到了识别作用,所在我们可以把重心放在识别之后该去做什么操作上面.很方便.
手势识别器是iOS中比较抽象的一个类,用于识别一个手势,所谓的手势:有规律的触摸.
手势识别器有7个子类:
分别是:轻怕手势,轻移手势,清扫手势,缩放手势,旋转手势,长按手势,以及屏幕边缘平移手势.
一旦指定的手势别识别了,就可以执行自定义好的操作了.
UITapGestureRecognizer是轻拍?手势识别器,能识别轻拍操作
UILongPressGestureRecognizer是?长按?手势识别器,能识别?长按操作。
UIRotationGestureRecognizer是旋转?手势识别器,能识别旋转操作。
UIPinchGestureRecognizer是捏合?手势识别器,能识别捏合操作。
UIPanGestureRecognizer是平移?手势识别器,能识别拖拽操作。
UISwipeGestureRecognizer是轻扫?手势识别器,能识别拖拽操作。
UIScreenEdgePanGestureRecognizer是屏幕边缘轻扫识别器,是iOS7中新增的?手势。
如何使用识别器:
我们不会直接使用手势识别器这个抽象父类,而是根据需要使用特定的手势识别器创建对象.
1.创建UIXXXGestureRecognizer对象,使用initWithTarget:action:方法
2.配置要识别的手势的相关信息
3.将手势添加到某个视图上
4.实现手势识别器里定义的方法
view 的transform 属性
transform 是 view的一个重要属性.它在矩阵层面上改变view的显示状态.能实现view的缩放.旋转.平移等等功能.
//创建一个点按轻拍的手势识别对象
//轻拍手势识别器,一旦识别轻拍手势,就会去执行self中的tap:方法,完全可以点一下执行多个方法!!但是我们一般不加
UITapGestureRecognizer *tapG =[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];
tapG.numberOfTapsRequired = 2; //点几下
tapG.numberOfTouchesRequired = 1;//几个手指
//创建一个旋转手势
UIRotationGestureRecognizer *rogR = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotage:)];
//注意 注意啦 这个地方 UILabel 和 UIImageView必须加这句
imageView.userInteractionEnabled = YES;
// [imageView addGestureRecognizer:tapG];
[imageView addGestureRecognizer:rogR];
[imageView release];