14-UIKit(拖拽手势、布局)
目录:
2.frame,bounds,transform,center区别
1.手势创建的拖拽方式
创建手势对象,修改手势对象属性,加入指定视图,这三件事都可以不用写代码,而用拖拽的方式完成。
设置拖拽方式手势代理的方法是:在第六个检查器里拖拽delegate到ViewController
设置拖拽方式手势触发调用的方法是:按住ctrl直接拖拽到.m文件里
2.frame,bounds,transform,center区别
2.1 类型
frame,bounds是CGRect{origin{x,y},size{width,height}}
transform是CGAffineTransform{a,b,c,d,dx,dy}
center是CGPoint{x,y}
label.font = [UIFont boldSystemFontOfSize:24];// 粗体
label.shadowOffset = CGSizeMake(0, 0.5); // 阴影偏移
label.shadowColor = [UIColor greenColor]; // 阴影颜色
2.2 属于谁
属于视图对象的属性
2.3 frame
1>描述该视图在父视图中的位置,和占用的空间大小。
2>经常如何使用frame属性,当此视图处在父视图下,想做以下事时,需要使用:
* 初始化此视图(子视图)的坐标信息(位置)
* 在不使用transform以及autolayout的前提下,修改坐标信息
3>当直接修改了视图的frame之后,会导致:
* .size -> bounds.size会发生变化,transform导致的frame改变不会导致bounds改变,
* .center属性会变
* 会导致transform变化,如果一个view的transform被主动修改后,该view的frame就不应该在直接修改
4>当一个视图没有进行transform时,该视图的.frame.size和bounds.size是一致的
2.4 bounds
1>描述此视图自己本身的坐标系的大小和父视图没任何关系
2>.bounds.origin中的x,y永远为0,由于和父视图无关,所以此值永远为0
3>在什么情况下用.bounds:
* 取值:当需要计算此视图中子视图的位置和大小时,取得此视图的宽高要用.bounds.size,不能用.frame.size
* 设置此属性的值:当视图的大小不由此视图,而由外部决定时,比如在自定义的cell中放一个视图,这个视图的大小由内容计算出,当计算出数据后,应该修改此视图的bounds属性
* 修改bounds属性会导致:
.frame.size会被改变
.center会被改变
2.5 transform
1>是视图在frame的基础上的变形
2>一般很少用,使用的前提:
* 没有使用autolayout技术
* 需要增加一些特效(缩放,旋转)
3>修改transf属性会导致:
* .frame属性会发生变化
* .center会发生变化
* 特别注意:transform不会导致bounds发生任何变化
2.6 center
1>是视图中心点坐标
2>需要移动视图时,可以不使用transform而做到位移
3>center改变会导致:
* .frame.origin改变
2.7 frame和bounds的区别
1>frame中有视图的位置信息,而bounds中没有
2>一般情况下(没有发生transform),frame中的size和boudns中的size是一致的
3>直接修改frame,bounds会跟着变化,修改bounds,frame也跟着变
4>但是,当transform改变了,frame会变,而boudns不会变,所有此时会导致frame.size和bounds.size不同
- (IBAction)doubleClickTap:(UITapGestureRecognizer *)sender {
// [self relocate:nil];
CGPoint p1= [sender locationInView:self.view];
CGPoint p2= [sender locationInView:self.imageView];
NSLog(@"self.view(%f,%f)",p1.x,p1.y);
NSLog(@"self.imageView(%f,%f)",p2.x,p2.y);
UILabel *label = [[UILabel alloc] init];
label.text = @"O";
label.textColor = [UIColor redColor];
label.font = [UIFont systemFontOfSize:];
CGRect frame = CGRectZero;
frame.origin = CGPointMake(p2.x - , p2.y - );
frame.size = CGSizeMake(, );
label.frame = frame;
[self.imageView addSubview:label];
}
3.触控(touch)
3.1 用户接触屏幕时产生touch对象,UITouch类型
3.2 获取用户的touch对象,有什么用:绘图、涂鸦、手写
3.3 如何获取touch对象,覆盖视图对象方法UIView中定义的三个方法,Began,Moved,Ended
// 用户touch时会调用此方法
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self];
NSLog(@"touch start:%f,%f",point.x,point.y);
}
// 用户不停的划时不停的调用此方法
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self];
NSLog(@"touch moved:%f,%f",point.x,point.y);
}
// 用户touch结束时调用此方法
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self];
NSLog(@"touch ended:%f,%f",point.x,point.y);
}
4.布局
4.1 摆放子视图或控件到父视图中
4.2 目的:屏幕的大小经常会发生变化,当屏幕大小改变后,为了让界面看起来没问题,需要多子视图的frame进行一些改变。
4.3 导致需要重新布局的原因
1>设备不同
2>屏幕的方向
3>状态栏
* 在ios7中不再挤占VC的控件,占20点的空间,默认是显示的,
// 隐藏状态栏
-(BOOL)prefersStatusBarHidden{
return YES;
}
* 来电话时,挤占空间
4>各种bar
navigationbar 占用44
toolbar 占用44
tabbar 占用49
5>键盘,情况复杂
4.4 如何进行布局
1>纯代码方式,代码中进行计算,功能强大,代码量大
2>autoresizing技术,可以用代码或storyboard
3>autolayout自动布局,storyboard,代码
5.代码布局
5.1在哪儿写布局代码,VC或view,如果在VC中写,覆盖一个方法:viewDidLayoutSubviews
作业:绘图板,支持多根线
MXDrawLineView
-NSMutableArray *lines;
-[item];MXLine线
-UIColor*currentColor
-CGFloat lineWidth;
MXLine
-NSMutableArray *points;
-[item]:MXPoint;
-UIColor *color;
-CGFloat width;
MXPoint
-x
-y
1)先画出一条线
2)画多条线
3)能调线宽,用slider调
4)能设置颜色,用几个按钮表示颜色
5)增加一个橡皮(画比较宽的白线)
注意:
手势和变形
1.手势即可以由视图对象来响应,也可以由视图控制器来响应
2.transform变形
缩放(scale)旋转(rotation)位移(translation),位移经常被center属性的修改代替
CGAffineTransform是结构体类型6个值,修改视图的transform属性是通过它的6个值完成的,而修改6个值是通过系统提供的C的API来做到:
CGAffineTransformScale/Rotation/...
CGAffineTransformMakeScale/Rotation/...
14-UIKit(拖拽手势、布局)的更多相关文章
- 干货之UICollectionViewFlowLayout自定义排序和拖拽手势
使用UICollectionView,需要使用UICollectionViewLayout控制UICollectionViewCell布局,虽然UICollectionViewLayout提供了高度自 ...
- 拖拽手势和清扫手势冲突时(UIPanGestureRecognizer和UISwipeGestureRecognizer冲突时)
故事发生在这样的情境上:给整个控制器添加了一个拖拽手势,然后又在控制上的每个Cell上加了左滑清扫手势,然后问题来了:只有拖拽手势起作用,而左滑手势没有效果了,然后怎么解决这个问题呢!先上图: 当给整 ...
- iOS开发拓展篇—xib中关于拖拽手势的潜在错误
iOS开发拓展篇—xib中关于拖拽手势的潜在错误 一.错误说明 自定义一个用来封装工具条的类 搭建xib,并添加一个拖拽的手势. 主控制器的代码:加载工具条 封装工具条以及手势拖拽的监听事件 此时运行 ...
- 如何在ScrollView滑动的瞬间禁用拖拽手势
如何在ScrollView滑动的瞬间禁用拖拽手势 效果: 在UIScrollView滑动的瞬间禁用pan手势,可以防止用户按着屏幕不放后导致出现的一些莫须有的bug. // // ViewContro ...
- iOS - xib中关于拖拽手势的潜在错误
iOS开发拓展篇—xib中关于拖拽手势的潜在错误 一.错误说明 自定义一个用来封装工具条的类 搭建xib,并添加一个拖拽的手势. 主控制器的代码:加载工具条 封装工具条以及手势拖拽的监听事件 此时运行 ...
- jQuery图片列表拖拽排序布局
在线演示 本地下载
- [翻译] UIView-draggable 可拖拽的UIView
UIView-draggable 可拖拽的UIView https://github.com/andreamazz/UIView-draggable UIView category that adds ...
- Flutter交互实战-即刻App探索页下拉&拖拽效果
前言 Flutter最近比较热门,但是Flutter成体系的文章并不多,前期避免不了踩坑:我这篇文章主要介绍如何使用Flutter实现一个比较复杂的手势交互,顺便分享一下我在使用Flutter过程中遇 ...
- 缩放系列(三):一个可以手势缩放、拖拽、旋转的layout
弄了一个下午,终于搞出来了,PowerfulLayout 下面是一个功能强大的改造的例子: 可以实现以下需求: 1.两个手指进行缩放布局 2.所有子控件也随着缩放, 3.子控件该有的功能不能丢失(像b ...
随机推荐
- javascript类型转换、运算符、语句
1.类型转换: 分为自动转换和强制转换,一般用强制转换. 其他类型转换为整数:parseint(): 其他类型转换为小数:parsefloat(): 判断是否是一个合法的数字类型:isNaN(): 是 ...
- [置顶] 关于CSDN2013博客之星的一些看法
最近一个周,最火的话题当然要数CSDN2013博客之星拉票了. 实话实说,从12月14日开始,我连续5天拉票. 通过QQ群.QQ好友.CSDN文章.给CSDN粉丝发私信等多种方式拉票,真是累死我了. ...
- python成长之路10——socketserver源码分析
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) 参数一:地址簇 socket.AF_INET ipv4(默认) socket.AF_INE ...
- Regex阅读笔记(一)之入门
在检查一行文本时,^代表一行的开始,$代表结束. 字符数组:[],在里面列举任意多个字符,可以匹配其中任意一个字符,字符组元字符'-'表示一个范围. ^$表示一个空行(没有任何字符,包括空白字符) [ ...
- struts OGNL数据标签
OGNL对象图导航语言,类似于el表达式,strut的底层就是用这个写的在导入struts-core的时候会导入ognl.jar public class Test { public static v ...
- 转:STL容器里存放对象还是指针
一.问题的引出: 容器可以存放对象,可以存放指针,这里要谈的是两者的使用问题.就是什么时候存放对象更好,什么时候存放指针更好? 二.问题的分析过程: 1. 首先说下stl容器的工作方式 对于内建类 ...
- 通过加索引对sql语句优化
今天看数据库的时候遇到这样一个SQL语句: select substr(a.djxh,) as id, (a.nd || a.yf) DECL_YM, a.zspm_dm as LEVY_ITEM_I ...
- poj 1579 Function Run Fun(记忆化搜索+dp)
题目链接:http://poj.org/problem?id=1579 思路分析:题目给出递归公式,使用动态规划的记忆搜索即可解决. 代码如下: #include <stdio.h> #i ...
- git 使用过程(二、创建版本库)
1.显示当前git所在操作文件路径 命令:pwd 2.改变当前操作路径 命令:cd /e/神马神马的,如果想到当前文件夹的某个子目录下,可以直接输入命令:cd 子目录名称,这样就可以了. 3.创建一 ...
- 10_9 java笔记
java中所有的关键字都是小写的注意main虽然被编译器识别,但是它并不是关键字包:(名字小写) 单级包:liyi 多级包:cn.itcast path 和classpath的区别:path环境变量里 ...