第五讲: 设计模式,手势识别器
本讲内容
一. Target/action设计模式
耦合: 耦合是衡量模块与模块之间关联程度的指标, 它是衡量一个程序写的好坏的标准之一
“高内聚,低耦合”是面向对象编程的核心思想
// 试想 系统点击方法touches实现点击事件的劣(lie, 四声)势
每个视图的点击事件都不一样,如何处理?
我们无法预先知道这个视图点击之后都要实现什么效果
因此我们在类内部提前写好点击事件不科学也不全面
// 使用Target/action实现解耦
二. 代理设计模式
Delegate模式: 当一个类的某些功能需要被别人来实现,但是既不明确是些什么功能,又不明确谁来实现这些功能的时候,委托模式就可以派上用场, 其目的是为了降低类之间的耦合性
//如何用Delegate实现解耦
delegate也是用来解耦的,它不再简简单单让目标去执行一个动
作了, 而是delegate去处理一系列事件、就像UITextFieldDelegate一样,能监测将要开始编辑,已经开始编辑、return按钮点击等等
Delegate使用场景
控件有一系列时间点,控制器可以实现这个代理方法,以便在适当
的时机做适当的事
三. UIImageView
UIImageView是iOS中用于显示图片的类,iOS中几乎所有看到的 图片,都是由这个类来显示的
四. 手势识别器
手势识别器是对触摸事件做了封装,我们无需自己去判断某个手势是否触发,手势识别器本身起到了识别作用,我们把重心放在识别之后要做什么操作上面, 它是iOS中比较抽象的一个类,共有七个子类
一旦指定的手势被识别, 我们可以执行我们自己定义好的操作
如何使用识别器
我们不会直接使用手势识别器这个抽象父类,而是根据需要使用特定的手势识别器创建对象
1、创建UIxxxGestureRecognizer对象,使用initWithTarget:action:方法
2、配置要识别的手势的相关信息
3、将手势添加到某个视图上
4、实现手势识别器里定义的方法
view的transform属性
transform是view的一个重要属性,它在矩阵层面上改变view的显示状态,能实现view的缩放、旋转、平移等等功能
#import "MainViewController.h"
@interface MainViewController ()
@property(nonatomic, retain)UIImageView *imageView;
@property(nonatomic, retain)UIAlertView *alertView;
@end
@implementation MainViewController
- (void)dealloc
{
// [self.view release]; self.view作为系统给出视图 不需要我们释放 我们只需要管我们创建的东西 即程序中看得见的retain || alloc
[self.imageView release];
[self.alertView release];
[super dealloc];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor brownColor];
// UIImageView
// UIImage *image1 = [[UIImage alloc] initWithContentsOfFile:@"scratch.png"]; // 这方法怎么用?
UIImage *image = [UIImage imageNamed:@"scratch.png"];
self.imageView = [[UIImageView alloc] initWithImage:image];
self.imageView.frame = CGRectMake(, , , );
self.imageView.backgroundColor = [UIColor yellowColor];
[self.view addSubview:self.imageView];
[self.imageView release];
// 把图片的用户交互打开,它默认是关闭的,此外还有一个控件是label
self.imageView.userInteractionEnabled = YES;
// 图片大小适应imageView.frame的大小
UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"28.jpg"]];
[self.view addSubview:iv];
[iv release];
// 调用initWithImage:方法,它创建出来的imageview的宽高和图片的宽高一样
UIImageView *im = [[UIImageView alloc] initWithFrame:self.view.bounds];
im.image = [UIImage imageNamed:@"28.jpg"];
[self.view addSubview:im];
[im release];
// 这种初始化方法怎么用?
UIImageView *iw = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"13.jpg"] highlightedImage:[UIImage imageNamed:@"28.jpg"]];
[scrollView addSubview:iw];
scrollView.contentSize = [UIImage imageNamed:@"13.jpg"].size;
[iw release];
iw.tag = ;
// 取网络图片的方法
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://fdfs.xmcdn.com/group16/M00/66/92/wKgDbFXgRVHx7qhRAAGp5e22Sas297_ios_large.jpg"]]];
iw.image = image;
// UIImageView 高亮图
UIImageView *headshotImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"image1.jpg"] highlightedImage:[UIImage imageNamed:@"image2.jpg"]];
headshotImageView.frame = CGRectMake(, , , );
headshotImageView.userInteractionEnabled = YES; // 打开这个
headshotImageView.tag = ;
[self.view addSubview:headshotImageView];
[headshotImageView release];
// UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
// [headshotImageView addGestureRecognizer:singleTap];
// [singleTap release];
//让一个UIImageView响应点击事件
UIImageView *imgView =[[UIImageView alloc] initWithFrame:CGRectMake(, ,, )];
imgView.userInteractionEnabled=YES;
UITapGestureRecognizer *singleTap =[[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(onClickImage)];
[imgView addGestureRecognizer:singleTap];
[singleTap release];
// 手势的使用
// 1.点击
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
// 设置点击几次才会触发方法
tap.numberOfTapsRequired = ;
// 设置几个手指进行点击
tap.numberOfTouchesRequired = ;
// 将手势添加到对应的图片上
[self.imageView addGestureRecognizer:tap];
[tap release];
// 2.长按
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressAction:)];
// 设置长按按钮触发的最短时间
longPress.minimumPressDuration = ;
// 用户手指在长按过程中允许移动的距离
longPress.allowableMovement = ; // 指的是点按中方法实现之前的那段时间,看移动距离是否超出范围,是则不执行方法,否则继续执行
// 把手势添加到图片上
[self.view addGestureRecognizer:longPress];
[longPress release];
// 3.旋转
// 创建一个旋转的手势
UIRotationGestureRecognizer *Rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationAction:)];
// 把手势放到对应的图片上
[self.imageView addGestureRecognizer:Rotation];
[Rotation release];
// 4.捏合
UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchAction:)];
[self.imageView addGestureRecognizer:pinch];
[pinch release];
// 5.拖拽
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)];
[self.imageView addGestureRecognizer:pan];
[pan release];
// 6.轻扫 // 怎么触摸 很难按出来.
UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeAction:)];
[self.imageView addGestureRecognizer:swipe];
[swipe release];
// 轻扫方向
swipe.direction = UISwipeGestureRecognizerDirectionRight;
// 7.屏幕边际方法
// UIScreenEdgePanGestureRecognizer // 自行查找
//
UIStepper *stepper = [[UIStepper alloc] initWithFrame:CGRectMake(, , , )];
stepper.backgroundColor = [UIColor whiteColor];
[stepper addTarget:self action:@selector(stepperAction:) forControlEvents:UIControlEventValueChanged];
[stepper setMinimumValue:]; //</span>
[stepper setMaximumValue:];
stepper.stepValue = ; //每次递增</span>
[stepper setWraps:YES];
[stepper setContinuous:YES];
[self.imageView addSubview:stepper];
// autorepeat: 控制是否在按住时自动持续递增或递减,默认YES;
[stepper release];
}
// 自定义的点击方法
//- (void)handleSingleTap:(UITapGestureRecognizer *)tap
//{
// UIImageView *headshotImageView = (UIImageView *)[self.view viewWithTag:888];
// headshotImageView.highlighted = !headshotImageView.highlighted;
// NSLog(@"单手点击方法");
//}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UIImageView *headshotImageView = (UIImageView *)[self.view viewWithTag:];
headshotImageView.highlighted = YES;
NSLog(@"点击开始");
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
UIImageView *headshotImageView = (UIImageView *)[self.view viewWithTag:];
headshotImageView.highlighted = NO;
NSLog(@"点击结束");
}
-(void)onClickImage{
// here, do whatever you wantto do
NSLog(@"imageview is clicked!");
}
- (void)stepperAction:(UIStepper *)stepper
{
// 此控件这么使用对于imageView没什么用? 因为点击该控件只能修改一次视图大小
int temp = stepper.value;
self.imageView.bounds = CGRectMake(temp, temp, temp, temp);
}
#pragma mark 清扫的方法:
- (void)swipeAction:(UISwipeGestureRecognizer *)swipe
{
if (swipe.direction == UISwipeGestureRecognizerDirectionRight) {
NSLog(@"向右");
}
self.imageView = (UIImageView *)swipe.view;
}
#pragma mark 拖拽的方法:通过拖拽手势,让视图随着手势的移动而移动
- (void)panAction:(UIPanGestureRecognizer *)pan
{
// 通过手势找视图
self.imageView = (UIImageView *)pan.view;
// 通过手势获得经过的店
CGPoint p = [pan translationInView:self.imageView];
// 设置移动的位置
self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, p.x, p.y);
// 为了防止手势在操作的时候视图消失
[pan setTranslation:CGPointZero inView:self.imageView];
// self.imageView.transform =
}
#pragma mark 捏合的方法:通过捏合手势,缩放图片
- (void)pinchAction:(UIPinchGestureRecognizer *)pinch
{
// 通过手势找视图
self.imageView = (UIImageView *)pinch.view;
// 通过transform改变图片的尺寸
self.imageView.transform = CGAffineTransformScale(self.imageView.transform, pinch.scale, pinch.scale);
pinch.scale = ;
}
#pragma mark 旋转的方法:通过图片的旋转手势,让图片发生旋转
- (void)rotationAction:(UIRotationGestureRecognizer *)Rotation
{
// 可以通过手势获取手势添加的视图是哪一个
self.imageView = (UIImageView *)Rotation.view;
// 进行旋转的操作
// 通过视图的transform属性,让视图进行旋转
// self.imageView.transform = CGAffineTransformMakeRotation(Rotation.rotation);
self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, Rotation.rotation);
Rotation.rotation = ;
NSLog(@"测试旋转");
}
#pragma mark 长按的方法
- (void)longPressAction:(UILongPressGestureRecognizer *)longPress
{
// 长按的状态
// longPress.state
// 长按之后弹出一个alertView
if (self.alertView == nil) { // 与!self.alertView同样
self.alertView = [[UIAlertView alloc] initWithTitle:@"老婆" message:@"让我亲一个吧!" delegate:self cancelButtonTitle:@"拒绝" otherButtonTitles:@"木马~", nil];
[self.alertView release];
}
NSLog(@"pia"); // 只要长按每次都打印两遍
[self.alertView show];
}
#pragma mark 点击的方法
- (void)tapAction:(UITapGestureRecognizer *)tap
{
NSLog(@"测试一下点击手势");
self.imageView.image = [UIImage imageNamed:@"image1.jpg"];
}