07 手势识别器、UIImageView、(transform)、模拟button内部实现触摸事件

重点

1.target…action和delegate是很重要的设计模式,务必理解原理以及熟练使用
2.手势识别器是很常用的类,在日常开发中经常使用,需要牢记每个手势识别器的特点以及注意事项
3.transform是view的重要属性,在屏幕旋转方面用的比较多。

1、手势识别器

注意7个手势识别器的特点以及注意事项。
UITapGestureRecognizer是轻拍手势识别器,能识别轻拍操作
UILongPressGestureRecognizer是长按手势识别器,能识别长按操作。
UIRotationGestureRecognizer是旋转 势识别器,能识别旋转操作。
UIPinchGestureRecognizer是捏合手势识别器,能识别捏合操作。
UIPanGestureRecognizer是平移手势识别器,能识别拖拽操作。
UISwipeGestureRecognizer是轻扫手势识别器,能识别拖拽操作。
UIScreenEdgePanGestureRecognizer是屏幕边缘轻扫识别器,是iOS7中新增的手势。

我们不会直接使用势识别器这个抽象 类, 是根据需要使 用特定的 手势识别器创建对象。
1、创建UIxxxGestureRecognizer对象,使用initWithTarget:action: 方法;
2、配置要识别的手势的相关信息;
3、将手势添加到某个视图上;
4、实现手势识别器 定义的方法

二、UIImageView的使用

常用方法和属性
image //设置图片
animationImages //设置一组动态图片
animationDuration //设置播放一次一组动态图片的时间
animationRepeatCount //设置重复次数
startAnimating //开始动画
stopAnimating //结束动画

UIImageView显示图片方法(2种)
第1种方法(可以)在view上面添加一个UIImageView
UIImageView *imageView = [[UIImageView alloc] initWithFrame:view.bounds];  
imageView.image = [[UIImage imageNamed:@"name.png"] stretchableImageWithLeftCapWidth:left topCapHeight:top];  
[view addSubview:imageView]; 

这种方法好处是在view释放后,内存中的东西也会释放。


第2种方法(推荐) quartzCore方式
UIImage *image = [UIImage imageNamed:@"name.png"];  
view.layer.contents = (id) image.CGImage;  
// 如果需要背景透明加上下面这句  
view.layer.backgroundColor = [UIColor clearColor].CGColor; 
图片的渲染方式(取消渲染)
[button setImage:[[UIImage imageNamed:@"1.jpg" ] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]  forState:UIControlStateNormal] ;
通过2D仿射函数实现小的动画效果(变大缩小) –可用于自定义pageControl中
       [UIView animateWithDuration:0.3 animations:^{
       imageView.transform = CGAffineTransformMakeScale(2, 2);
       } completion:^(BOOL finished) {
       imageView.transform = CGAffineTransformMakeScale(1.0, 1.0);
       }];

3.transform(2D仿射变换函数)
详见课上代码
//平移手势的回调方法

- (void)panAction: (UIPanGestureRecognizer *)sender{

    //得到当前手势所在试图
    UIView *view = sender.view;//
    //得到我们在视图上移动的偏移量(x,y组合成点)
    CGPoint currentPoint = [sender translationInView:view.superview];//在父视图的偏移量
    /* 2D仿射变换函数中的 与位移有关的函数 来实现视图的位置变化 */
    view.transform = CGAffineTransformTranslate(view.transform, currentPoint.x, currentPoint.y);
    //复原 先讲偏移量从0开始,阻止累加
    [sender setTranslation:CGPointZero inView:view.superview];

        NSLog(@"我平移了 gestureView");

}//-----------------------由此例可知因此手势也是触碰事件TouchEvents


//旋转手势的回调方法

- (void)rataAction: (UIRotationGestureRecognizer *)sender{

    //通过旋转手势得到旋转角度
    float rota = sender.rotation;

    //得到该手势当前所作用的视图
    UIView *view = sender.view;
    /* 2D仿射变换函数中的 旋转函数 来实现视图的旋转 */
    view.transform = CGAffineTransformRotate(view.transform, rota);//<#CGFloat angle#> 旋转角度
    //复原
    sender.rotation = 0;

    NSLog(@"我旋转了 gestureView");
}



//捏合手势的回调方法

- (void)pinchAction: (UIPinchGestureRecognizer *)sender{

    //通过捏和手势得到缩放比率
    float scale = sender.scale;

    //得到捏合手势所作用的视图
    UIView *view = sender.view;
    /* 2D仿射变换函数中的 缩放函数 来实现视图的放大缩小 */
    /*
    是在原有基础上来改变当前的视图  Alt键模拟捏合
    函数的第一个参数:<#CGAffineTransform t#> 现有的视图的transform矩阵
    第二个参数:<#CGFloat sx#> x轴上的缩放比率
    第三个参数:<#CGFloat sy#> y轴上的缩放比率*/
    view.transform = CGAffineTransformScale(view.transform, scale, scale);//参照新生成当前视图
//    /*是在视图最初的transform状态上改变,不管执行多少次,都是以最初的transform状态为基础来改变*/
//    view.transform = CGAffineTransformMakeScale(0.5, 0.5);//参照最初视图
    //每次捏合动作完毕后,让此捏合值复原,使得它每次都是从100%开始缩放
    sender.scale = 1;//复原

    NSLog(@"我捏合了 gestureView");
}

//轻拍手势的回调方法

- (void)tapAction: (UITapGestureRecognizer *)sender{

    //可以根据手势得到它当前所作用的视图
    UIImageView *imageView = (UIImageView *)sender.view;

    //由tag得到textfield
    /*viewWithTag:此方法的返回值为UIView类型,但是UITextField为UIView的子类,父类指针不能直接指向子类对象,所以需要强制转换*/
//    UITextField *textField = (UITextField *)[self.window viewWithTag:1000];
//    /*回收键盘,取消第一响应者*/
//    [textField resignFirstResponder];

    NSLog(@"我轻拍了 gestureView");


}
注意:

1 、 UIImageView的用户交互默认是关闭的,要想使它可以处理触摸时间,需要手动打开它
2 、 一个视图可以添加多种手势,但是一个手势,只能添加到一个视图上
3 、点击屏幕空白处回收键盘♻️方法

//轻拍手势的回调方法

- (void)tapAction: (UITapGestureRecognizer *)sender{

    //可以根据手势得到它当前所作用的视图
    UIImageView *imageView = (UIImageView *)sender.view;

    //由tag得到textfield
    /*viewWithTag:此方法的返回值为UIView类型,但是UITextField为UIView的子类,父类指针不能直接指向子类对象,所以需要强制转换*/
//    UITextField *textField = (UITextField *)[self.window viewWithTag:1000];
//    /*回收键盘,取消第一响应者*/
//    [textField resignFirstResponder];

    NSLog(@"我轻拍了 gestureView");


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值