目录:

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. wpf全局异常

    在App.xaml文件中 添加DispatcherUnhandledExceptionEventArgs 新增对应事件

  2. Tableau Server 8.0 升级到 8.3 过程记录

    一.使用账号(管理员权限),安装文件复制到服务器 二.检查维护状态 如果维护状态过期,更新到新版本会变成未授权. 先进Manage Product Keys刷新一下维护日期(其实不刷新也无所谓.到时候 ...

  3. Hive环境搭建心得(Ubuntu)

    Hive是什么? 基于Hadoop的数据查询工具,可以使用类SQL进行数据查询. Hadoop安装 参考了Hadoop安装 注意到etc/hadoop/hadoop-env.sh里设置JAVA_HOM ...

  4. 【转载】国内网站博客数据统计选免费Google Analytics还是百度统计

    [转载]国内网站博客数据统计选免费Google Analytics还是百度统计 Google Analytics谷歌统计是我用的第一个网站统计工具,当然现在也一直在用.Google Analytics ...

  5. hdu 2814 快速求欧拉函数

    /** 大意: 求[a,b] 之间 phi(a) + phi(a+1)...+ phi(b): 思路: 快速求欧拉函数 **/ #include <iostream> #include & ...

  6. chrome浏览器强制采用https加密链接

    在chrome地址栏输入chrome://net-internals/#hsts,然后把www.google.com添加到domain,并且Include subdomains全部沟上添加就可以了.

  7. 让Qt支持Win7的Aero和毛玻璃效果

    Qt5增加了许多特性,其中 Qt Windows Extras 模块就增加了对Win7 Aero 效果的支持. 官网的介绍如下: Qt Windows Extras provide classes a ...

  8. JavaEE Tutorials (7) - 在会话bean中使用异步方法调用

    7.1异步方法调用88 7.1.1创建异步业务方法88 7.1.2从企业bean客户端调用异步方法897.2async示例应用90 7.2.1async—war模块的架构91 7.2.2运行async ...

  9. java学习之内省

    反射加内省解决耦合问题 package com.gh.introspector; /** * JavaBean * @author ganhang * */ public class Dog { pr ...

  10. GQ_百度百科

    GQ_百度百科 <GQ>杂志(原名<Gentlemen's Quarterly>,中文名<智族>)是一本男性月刊,内容著重于男性的时尚.风格.文化,也包括美食.电影 ...