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

来源:互联网 发布:幸运星 网络偶像大师 编辑:程序博客网 时间:2024/06/15 14:57
重点

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");}
0 0