您的位置:首页 > 产品设计 > UI/UE

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

2015-12-18 20:12 489 查看
重点

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: