码迷,mamicode.com
首页 > 移动开发 > 详细

iOS开发-高级UI-手势识别

时间:2015-08-02 16:29:52      阅读:295      评论:0      收藏:0      [点我收藏+]

标签:

一、手势识别器
//0.打开UIImageView的用户交互
self.iconView.userInteractionEnabled = YES;
//1.创建手势识别器
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
//1.1.设置手势识别器的属性
//设置用户必须点击几次才能触发点击事件
tap.numberOfTapsRequired = 2;
//设置用户必须两根手指同时点击才会触发事件
tap.numberOfTouchesRequired = 2;

tap.delegate = self;(并遵守协议)

//2.添加手势识别器到view
[self.iconView addGestureRecognizer:tap];

//3.监听手势识别器
[tap addTarget:self action:@selector(tapView)];

//该方法返回一个BOOL值,该BOOL值决定了是否相应此次点击事件
所以如果返回NO,就不会调用tapView方法。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)
gestureRecognizershouldReceiveTouch:(UITouch *)touch
{
//获取点击的位置
CGPoint point = [touch locationInView:touch.view];
if(point.x > self.iconView.frame.size.width * 0.5){
return YES;
}else {
return NO;
}
}

-(void)tapView
{
NSLog(@“图片被点击了”);
}

二、长按+轻扫
1.拖一个View,然后拖成属性costomView
2.长按事件
-(void)test
{

//1.创建手势识别器
UILongPressGestureRecognizer longPress =
[[UILongPressGestureRecognizer alloc] init];
//1.1设置长按手势识别器的属性
longPress.minimumPressDuration = 5;
//手指按下后事件响应之前允许手指移动的偏移位
longPress.allowableMovement = 10;
//2.添加手势识别器到View
[self.customView addGestureRecognizer:longPress];
//3.监听手势识别器
[longPress addTarget:self action:@selector(longPressView)];
}

-(void)longPressView
{
NSLog(@“长按事件”);
}

3.轻扫事件
-(void)test
{

//1.创建手势识别器
UISwipeGestureRecognizer Swipe =
[[UISwipeGestureRecognizer alloc] init];

//设置轻扫的方向(同样的代码来4份即可4个方向都有)
swipe.direction = UISwipeGestureRecognizerDirecionDown;
//2.添加手势识别器到View
[self.customView addGestureRecognizer:Swipe];
//3.监听手势识别器
[Swipe addTarget:self action:@selector(SwipeView)];
}

-(void)SwipeView
{
NSLog(@“轻扫事件”);
}

三、旋转+缩放
1.将图片拖成属性iconView
2.旋转(记得在故事板右边开启多点触控)
UIRotationGestureRecognizer *gesture =
[[UIRotationGestureRecognizer alloc] init];
[self.iconView addGestureRecognizer:gesture];
gesture.delegate = self;

[gesture addTarget:self action:@selector(rotationView:)];

-(void)rotationView:(UIRotationGestureRecognizer *)gesture
{
NSLog(@"旋转事件 %.1f", gesture.rotation);
//在传入的transform基础上递增一个弧度
self.iconView.transform = CGAffineTransformMakeRotate
(self.inconView.transform gesture.rotation);
//每次都把上一次手势的位置作为0度,不这样做的话,如果本来是45度,下次再转1度
就会在原有基础上增加46度,而这样就不对了。
gestrue.rotation =0;
}

3.放缩
//捏合手势
UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc]init];
[self.iconView addGestureRecognizer:pinch];
pinch.delegate = self;

[pinch addTarget:self action:@selector(pinchView)];

-(void)pinchView:(UIPinchGestureRecognizer *)pinch
{
self.iconView.transform = CGAffineTransformScale(self.iconView.transform
,pinch.scale,pinch.scale);
//如果上一次的位置不设置为1.0,就会在原有基础上继续放缩,这是不对的。
pinch.scale = 1.0;

}

4.遵从代理协议,实现代理方法,使其支持多手势同时进行
//该方法返回的BOOL值决定了view是否能够同时响应多个手势
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultanenouslyWithGestureRecognizer:
(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}

四、拖拽
1.将图片拖成属性costomView
2.拖拽
UIPanGestureRecognizer *pan= [[UIPanGestureRecognizer alloc] init];
[self.costomView addGestureRecognizer:pan];

[pan addTarget:self action:@selector(panView:)];

- (void)panView
{
//返回的值是以手指按下的点为原点
CGPoint point = [pan translationInView:pan.view];
CGPoint temp = self.customView.center;
temp.x += point.x;
temp.y += point.y;
self.customView.center = temp;
//将其清零
[pan.setTranlation:CGPointZero inView:pan.view];

}

五、CALayer基本使用
掌握
CALayer的基本属性
CALayer和UIView的关系
position和anchorPoint的作用

CALayer
*在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮,一个文本标
签,一个文本输入框,一个图标等,这些都是UIView
*其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层
*在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过
UIView的layer属性可以访问这个层
@property(nonatomic,readonly,retain)CALayer *layer;
*当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘图,并且会将所有内容
绘制在自己的图层上,绘图完毕后,系统会将图层拷贝到屏幕上,于是就完成了
UIView的显示。
*换句话说,UIView本身不具备显示的功能,是它内部的层才有显示功能

CALayer的基本使用
*通过操作CALayer对象,可以很方便地调整UIView的一些外观属性,比如:
阴影,圆角大小,边框宽度和颜色
*还可以给图层添加动画,来实现一些比较炫酷的效果

CAlayer的属性
*宽度和高度
@property CGRect bounds;
*位置(默认指中点,具体由anchorPoint决定)
@property CGPoint position;
*锚点(x,y的范围都是0-1),决定了position的含义
@property CGPoint anchorPoint;
*背景颜色(CGColorRef类型)
@property CGColorRef backgroundColor;
//所以设置颜色应该 XX = [UIColor greenColor].CGColor;
*形变属性(设置Z为非0,则是2d旋转)
@property CGTransform3D transform;
PS:如果要求赋值id类型,那么则在赋值的对象前加上(id)即可。
*设置圆角
cornerRadius是设置主图层(CALayer)的圆角
*设置内容
layer.contents = (id)[UIImage imageNamed:@"me"].CGImage;
contents,比如设置了一张图片,那么会自动创建一个子图层展示UIImage,这样如果
主图层设置了圆角,那么当这个子图层盖在上面时,四个角会多出来。如何解决呢?
//设置超出主图层的部分剪切掉(连阴影也剪切掉,所以如果既想显示阴影又不想显示
四个角,则直接将图片处理为圆角即可)
self.customView.layer.masksToBounds = YES;
*设置阴影
shadowColor是设置阴影颜色
shadowOffset是设置阴影偏移位(如果为正数,代表往右和下偏移)
shadowOpacity是设置阴影透明度 0-1 1完全不透明 0完全透明

六、自定义Layer和锚点等
//1.创建layer
CALayer *layer = [CALayer alloc] init];
layer.backgroundColor = [UIColor redColor].CGColor;
layer.bounds = CGRectMake(0,0,100,100);
layer.position = CGPointMake(200,200);
layer.borderWidth = 10;
layer.cornerRadius = 10;

//将layer添加在界面上
[self.view.layer addSublayer:layer];

layer.superlayer; //获取layer的父视图

PS:如果一个控件是另外一个控件的子控件,那么这个控件中的layer也是它的子layer

关于CALayer的疑惑
首先
CALayer是定义在QuartzCore框架中的
CGImageRef、CGColorRef两种数据类型是定义在CoreGraphics框架中的
UIColor、UIImage是定义在UIKit框架中的

其次
QuartzCore框架和CoreGraphics框架是可以跨平台使用的,在iOS和Mac OS X上都能
使用,但是UIKit智能在iOS中使用
为了保证可移植性,QuartzCore不能使用UIImage,UIColor,只能使用CGImageRef
、CGColorRef,所以要在之后加上.CGColor等才可以赋值。


UIView和CALayer的选择
通过CALayer,就能做出跟UIImageView一样的界面效果
既然CALayer和UIView都能实现相同的显示效果,那究竟选择谁好呢?
其实,对比CALayer,UIView多了一个事件处理的功能,也就是说,CALayer不能处理
用户的触摸事件,而UIView可以
所以如果显示出来的东西需要跟用户进行交互的话,用UIView
如果不需要跟用户进行交互的话,都可以
当然,CALayer的性能会高一些,因为它少了事件处理的功能,更加轻量级
如果公司对性能要求不是很苛刻的话,用UIView即可。不然突然需要响应事件就蛋碎
一地了。

positon和anchorPoint
CALayer有2个非常重要的属性:position和anchorPoint

@property CGPoint position;
用来设置CALayer在父层中的位置
以父层的左上角为原点

@property CGPoint anchorPoint;
成为定位点,锚点
决定着CALayer身上的哪个点会在position属性所指的位置
以自己的左上角为原点
它的x,y取值范围都是0-1,默认值为(0.5,0.5)

iOS开发-高级UI-手势识别

标签:

原文地址:http://www.cnblogs.com/marshall-yin/p/4695892.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!