目录:

1.手势创建的拖拽方式

2.frame,bounds,transform,center区别

3.触控(touch)

4.布局

5.代码布局

回到顶部

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(拖拽手势、布局)的更多相关文章

  1. 干货之UICollectionViewFlowLayout自定义排序和拖拽手势

    使用UICollectionView,需要使用UICollectionViewLayout控制UICollectionViewCell布局,虽然UICollectionViewLayout提供了高度自 ...

  2. 拖拽手势和清扫手势冲突时(UIPanGestureRecognizer和UISwipeGestureRecognizer冲突时)

    故事发生在这样的情境上:给整个控制器添加了一个拖拽手势,然后又在控制上的每个Cell上加了左滑清扫手势,然后问题来了:只有拖拽手势起作用,而左滑手势没有效果了,然后怎么解决这个问题呢!先上图: 当给整 ...

  3. iOS开发拓展篇—xib中关于拖拽手势的潜在错误

    iOS开发拓展篇—xib中关于拖拽手势的潜在错误 一.错误说明 自定义一个用来封装工具条的类 搭建xib,并添加一个拖拽的手势. 主控制器的代码:加载工具条 封装工具条以及手势拖拽的监听事件 此时运行 ...

  4. 如何在ScrollView滑动的瞬间禁用拖拽手势

    如何在ScrollView滑动的瞬间禁用拖拽手势 效果: 在UIScrollView滑动的瞬间禁用pan手势,可以防止用户按着屏幕不放后导致出现的一些莫须有的bug. // // ViewContro ...

  5. iOS - xib中关于拖拽手势的潜在错误

    iOS开发拓展篇—xib中关于拖拽手势的潜在错误 一.错误说明 自定义一个用来封装工具条的类 搭建xib,并添加一个拖拽的手势. 主控制器的代码:加载工具条 封装工具条以及手势拖拽的监听事件 此时运行 ...

  6. jQuery图片列表拖拽排序布局

    在线演示 本地下载

  7. [翻译] UIView-draggable 可拖拽的UIView

    UIView-draggable 可拖拽的UIView https://github.com/andreamazz/UIView-draggable UIView category that adds ...

  8. Flutter交互实战-即刻App探索页下拉&拖拽效果

    前言 Flutter最近比较热门,但是Flutter成体系的文章并不多,前期避免不了踩坑:我这篇文章主要介绍如何使用Flutter实现一个比较复杂的手势交互,顺便分享一下我在使用Flutter过程中遇 ...

  9. 缩放系列(三):一个可以手势缩放、拖拽、旋转的layout

    弄了一个下午,终于搞出来了,PowerfulLayout 下面是一个功能强大的改造的例子: 可以实现以下需求: 1.两个手指进行缩放布局 2.所有子控件也随着缩放, 3.子控件该有的功能不能丢失(像b ...

随机推荐

  1. javaweb学习路之一--web项目搭建

    概述: 工作闲暇时间想要自己搭建一个web项目玩玩,没想到大半天才弄了一个springMVC+mybatis的网站,简直菜的不行,以下记录所有的步骤加深印象 使用环境 1.jdk1.8 2.maven ...

  2. STL之set和multiset(集合)

    set和multiset会根据特定的排序准则,自动将元素进行排序.不同的是后者允许元素重复而前者不允许. constructing sets #include #include using names ...

  3. python成长之路10

    断点续传   python2.7 多继承  py35多继承   socketserver源码     支持并发处理socket   i/o多路复用   上节回顾     socket          ...

  4. VS QT 配置OpenGL

    在visual studio 下编译OpenGL代码出现以下错误,原因是vs没有自带opengl库,需要自己引入 无法解析的外部符号 __imp__glClear@4 无法解析的外部符号 __imp_ ...

  5. Test class should have exactly one public zero-argument constructor

    java.lang.Exception: Test class should have exactly one public zero-argument constructor at org.juni ...

  6. os.path.exists(path) 和 os.path.lexists(path) 的区别

    使用os.path.exists()方法可以直接判断文件是否存在.代码如下:>>> import os>>> os.path.exists(r'C:\1.TXT') ...

  7. 基于visual Studio2013解决C语言竞赛题之0408素数

      题目 解决代码及点评 判断一个数是不是素数的方法,一般是看n是不是能被n以内的某个整数(1除外)整除 为了提高效率,这个整数范围一般缩小到n的平方根 如果在这个范围内的整数都不能整除,那么 ...

  8. BZOJ 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典

    题目 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 401  Solv ...

  9. VBS脚本病毒特点及如何防范3(转)

    5.Vbs病毒生产机的原理介绍 所谓病毒生产机就是指可以直接根据用户的选择产生病毒源代码的软件.在很多人看来这或许不可思议,其实对脚本病毒而言它的实现非常简单. 脚本语言是解释执行的.不需要编译,程序 ...

  10. zzuli生化危机(dfs)

    生化危机 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 73  Solved: 21SubmitStatusWeb Board Description ...