UIImageView+GestureRecognizer

来源:互联网 发布:南沙人工智能产业园 编辑:程序博客网 时间:2024/05/20 14:18
            第五讲: 设计模式,手势识别器                    本讲内容

一. 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(130, 200, 120, 200);    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 = 500;    // 取网络图片的方法    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(25, 10, 100, 100);    headshotImageView.userInteractionEnabled = YES; // 打开这个    headshotImageView.tag = 888;    [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(0, 0,320, 44)];    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 = 2;    // 设置几个手指进行点击    tap.numberOfTouchesRequired = 2;    // 将手势添加到对应的图片上    [self.imageView addGestureRecognizer:tap];    [tap release];    // 2.长按    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressAction:)];    // 设置长按按钮触发的最短时间    longPress.minimumPressDuration = 1;    // 用户手指在长按过程中允许移动的距离    longPress.allowableMovement = 50;   // 指的是点按中方法实现之前的那段时间,看移动距离是否超出范围,是则不执行方法,否则继续执行    // 把手势添加到图片上    [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(0, 0, 20, 20)];    stepper.backgroundColor = [UIColor whiteColor];    [stepper addTarget:self action:@selector(stepperAction:) forControlEvents:UIControlEventValueChanged];    [stepper setMinimumValue:0];    //</span>    [stepper setMaximumValue:100];    stepper.stepValue = 80;         //每次递增</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:888];    headshotImageView.highlighted = YES;    NSLog(@"点击开始");}- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{    UIImageView *headshotImageView = (UIImageView *)[self.view viewWithTag:888];    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 = 1;}#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 = 0;    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"];}
0 0
原创粉丝点击