OC-手势&变形&坐标系bounds、frame、center
来源:互联网 发布:投资知乎 编辑:程序博客网 时间:2024/06/07 03:53
1. 手势
将用户物理性的触屏操作变成对象存储起来,所有手势的父类 UIGestureRecognizer
系统将一些有特点的触屏操作封装成不同的手势类型包括以下几种:
- UITapGestureRecognizer 点击
- UISwipeGestureRecognizer 轻扫
- UILongPressGestureRecognizer 长按
- UIPinchGestureRecognizer 捏合
- UIPanGestureRecognizer 拖拽
- UIRotationGestureRecognizer 旋转
如何使用手势?
- step1:创建指定手势的实例,在创建时设定当该手势发生时,系统会自动发什么消息
- step2.设置手势的核心属性
- step3.将手势添加到某个视图中,当用户在该视图上做了相应的动作,就会触发手势,系统会捕获并调用手势的事件方法
a.Taps手势
- 核心属性
- numberOfTapsRequired
- numberOfTouchesRequired
- (void)viewDidLoad { [super viewDidLoad]; //1.创建手势对象 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap:)]; //2.设置手势的核心属性 tap.numberOfTapsRequired = 5; //点几次 tap.numberOfTouchesRequired = 1; //几个触摸点 //3.将手势添加到某个视图中,当用户在该视图上做了相应的动作,就会触发手势,系统会捕获并调用手势的事件方法 [self.myView addGestureRecognizer:tap];}-(void)tap:(UITapGestureRecognizer*)gr { NSLog(@"点击手势触发,点中的位置是 %@", NSStringFromCGPoint([gr locationInView:self.myView]));}
b.Swipe 手势 (轻扫)
- 核心属性
- direction 方向
- (void)viewDidLoad { [super viewDidLoad]; UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipe:)]; //上下左右 只 触发 左右 swipe.direction = UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown; [self.view addGestureRecognizer:swipe];}-(void)swipe:(UISwipeGestureRecognizer*)gr { NSLog(@"清扫方向 %lu", gr.direction); //结束父视图编辑 收键盘 [self.view endEditing:YES];}
上面两个手势 都是 一次性手势,即手势发生过程中,响应方法只执行依次
c. UILongPress 手势 长按
- 核心属性
- minimumPressDuration 长按所需最小时间
- (void)viewDidLoad { [super viewDidLoad]; UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress:)]; //设置长按触发最小时间 longPress.minimumPressDuration = 2; [self.view addGestureRecognizer:longPress];}-(void)longPress:(UILongPressGestureRecognizer*)gr { NSLog(@"%@", NSStringFromCGPoint([gr locationInView:self.view])); if (gr.state == UIGestureRecognizerStateBegan) { NSLog(@"开始长按"); }else if(gr.state == UIGestureRecognizerStateChanged) { NSLog(@"移动"); }else if(gr.state == UIGestureRecognizerStateEnded) { NSLog(@"长按手势结束"); }}
d. UIPan 手势 拖拽
三种拖拽方式
- (void)viewDidLoad { [super viewDidLoad]; UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(pan:)]; [self.view addGestureRecognizer:pan];}-(void)pan:(UIPanGestureRecognizer*)gr { NSLog(@"1--%@",NSStringFromCGPoint([gr locationInView:self.view])); NSLog(@"2--%@",NSStringFromCGPoint([gr translationInView:self.view])); //方式一 if (gr.state == UIGestureRecognizerStateBegan) { self.startPos = self.imageView.center; }else { CGPoint translation = [gr translationInView:self.view]; CGPoint center = self.imageView.center; center.x = self.startPos.x + translation.x; center.y = self.startPos.y + translation.y; self.imageView.center = center; } //方式二// CGPoint translation = [gr translationInView:self.view];// CGPoint center = self.imageView.center;// center.x += translation.x;// center.y += translation.y;// self.imageView.center = center;// [gr setTranslation:CGPointZero inView:self.view]; //方式三// if (gr.state == UIGestureRecognizerStateBegan) {// //手势开始时 记录 起始位置// self.startPos = [gr locationInView:self.view];// }else if (gr.state == UIGestureRecognizerStateChanged){// //获取本次 移动的位置// CGPoint move = [gr locationInView:self.view];// //图片的位置的等于当前位置 加上 移动位置-上次位置 的 偏移// CGPoint center = self.imageView.center;// center.x += move.x - self.startPos.x;// center.y += move.y - self.startPos.y;// self.imageView.center = center;// //设置本次位置 为下次的 起始位置// self.startPos = move;// }}
e. UIPich 手势 捏合
- (void)viewDidLoad { [super viewDidLoad]; UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinch:)]; [self.view addGestureRecognizer:pinch];}-(void)pinch:(UIPinchGestureRecognizer*)gr { NSLog(@"速率 %.2f",gr.velocity); NSLog(@"缩放比 %.2f",gr.scale);}
f. UIRotation 手势 旋转
- (void)viewDidLoad { [super viewDidLoad]; UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotation:)]; [self.view addGestureRecognizer:rotation];}-(void)rotation:(UIRotationGestureRecognizer*)gr { NSLog(@"%.2f",gr.rotation);}
2.变形 (transform)
- 什么是变形
- 视图发生了 位移, 缩放, 旋转这样的变化叫做变形
- 如何实现视图的变形
- 通过修改视图对象 transform属性就能完成变形
- transform属性
- 类型 CGAffineTransform (结构体类型)
- 修改transform
- translation 位移
- scale 缩放
- rotation 旋转
- CGAffineTransformMakeTranslation
- CGAffineTransformTranslate
- CGAffineTransformMakeScale
- CGAffineTransformScale
- CGAffineTransformMakeRotation
- CGAffineTransformRotate
- 清除视图的所有变形
- CGAffineTransformIdentity
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { //位移变化 //CGAffineTransformMakeTranslation 变形是基于变形前的那个基础状态// self.imageView.transform = CGAffineTransformMakeTranslation(50, 50); //变形是在 当前 变形基础上 继续变形 self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, 50, 50); //缩放变形// self.imageView.transform = CGAffineTransformMakeScale(1.1, 1.5); self.imageView.transform = CGAffineTransformScale(self.imageView.transform, 1.02, 1.02); //旋转变化// self.imageView.transform = CGAffineTransformMakeRotation(M_PI_4); self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, M_PI_4); NSLog(@"transform %@",NSStringFromCGAffineTransform(self.imageView.transform));}- (IBAction)resetTranform:(id)sender {// CGAffineTransformIdentity 是个常量, 用该常量给 transform属性赋值 会 清空 transform 的所有变形 self.imageView.transform = CGAffineTransformIdentity; NSLog(@"transform %@",NSStringFromCGAffineTransform(self.imageView.transform));}
手势加变形综合应用
多手势同时出发必须使用 UIGestureRecognizerDelegate 代理
//手势代理方法 返回YES是可以同时触发-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES;}- (void)viewDidLoad { [super viewDidLoad]; //拖拽 UIPanGestureRecognizer *panGR = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGR:)]; self.imageView.userInteractionEnabled = YES;//imageView默认关闭用户交互 [self.view addGestureRecognizer:panGR]; //捏合 UIPinchGestureRecognizer *pinchGR = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinchGR:)]; pinchGR.delegate = self; [self.view addGestureRecognizer:pinchGR]; //旋转 UIRotationGestureRecognizer *rotationGR = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotationGR:)]; rotationGR.delegate = self; [self.view addGestureRecognizer:rotationGR]; //点击 UITapGestureRecognizer *tapGR = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGR:)]; [self.view addGestureRecognizer:tapGR];}-(void)tapGR:(UITapGestureRecognizer*)gr { self.imageView.transform = CGAffineTransformIdentity;}-(void)rotationGR:(UIRotationGestureRecognizer*)gr { CGFloat rotation = gr.rotation; self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, rotation); gr.rotation = 0;}-(void)pinchGR:(UIPinchGestureRecognizer*)gr { CGFloat scale = gr.scale; self.imageView.transform = CGAffineTransformScale(self.imageView.transform, scale, scale); gr.scale = 1;}-(void)panGR:(UIPanGestureRecognizer*)gr {// CGPoint translation = [gr translationInView:self.view];// CGPoint center = self.imageView.center;// center.x += translation.x;// center.y += translation.y;// self.imageView.center = center;// [gr setTranslation:CGPointZero inView:self.view]; CGPoint translation = [gr translationInView:self.view]; self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, translation.x, translation.y); [gr setTranslation:CGPointZero inView:self.view];}
3.深入坐标系 (frame bounds center transform)
1.frame
- 类型:CGRect类型
- 作用:定位—视图的左顶点在父视图坐标系中的对应的点的坐标,以及视图在父视图中占据了多大的空间
2.bounds
- 类型:CGRect类型
- 作用:描述了视图自身的坐标系的顶点的值,以及视图自身的尺寸大小
3.center
- 类型:CGPoint类型
- 作用:描述了视图中心点在父视图坐标系下的位置
4.transform
- 类型:CGAffineTransform 类型
作用:描述视图的变形状态
通过更改bounds实现scroll滑动效果
//手势的事件方法- (IBAction)panMove:(UIPanGestureRecognizer*)sender { CGPoint move = [sender translationInView:self.view]; CGRect bounds = self.myView.bounds; if (move.y < 0) { //向上拖拽 //bounds 应该越来越大 bounds.origin.y += -move.y; }else if (move.y > 0) { //向下拖拽 //bounds 应该越来越小 bounds.origin.y -= move.y; } self.myView.bounds = bounds; [sender setTranslation:CGPointZero inView:self.view];}
———————————————————————————————
———————————————————————————————
1 0
- OC-手势&变形&坐标系bounds、frame、center
- OC-UI-002.按钮的属性frame、bounds、center
- frame、bounds、center
- frame.bounds和center
- frame | center |bounds |transform
- frame、bounds和center
- frame bounds center
- frame,bounds和center
- frame、bounds、center
- frame.center和bounds
- uiview frame,bounds,center 理解
- frame、bounds、center的区别
- uiview frame,bounds,center 理解
- ios bounds ,frame,center 使用方法
- frame\bounds\center的区别
- frame、center、bounds、transframe属性
- frame\center\bounds的区别
- UIView frame, bounds and center
- 项目09-23
- 问题记录一:有关使用函数崩溃问题
- 学习笔记之String源码
- redis的简介和简单安装
- Flex 布局教程:语法篇
- OC-手势&变形&坐标系bounds、frame、center
- 向Eclipse 中导入WorkSpace已有Android项目
- 微信小程序把玩(一)Hello WeApp
- SVN主干发布与分支发布的区别
- 每个程序员必看:如何在40岁后继续做软件开发?
- LeetCode141—Linked List Cycle
- VS2013 QT可以编译通过但是头文件有红线
- 跳槽谋发展:人生发展的一些思考和最近找工作的坎坷经历
- 数据结构之线性表的线性分配动态存储