UIImageView+GestureRecognizer

            第五讲: 设计模式,手势识别器
                    本讲内容

一. 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值