在写程序的时候发现,iOS下的坐标、位置很容易弄乱,特别是在不同的坐标系统中,必须完成弄明白一些概念才能做相应的变化,例如CoreImage和UIView的坐标系统就截然不同,一个是以屏幕的左上角为原点,一个是以屏幕的左下角为原点。总体上,IOS中包含UIKit坐标系(X轴正方向向右,Y轴正方向向下)和标准的Quartz 2D绘图坐标系(X轴正方向向右,Y轴正方向向上),下面,解释一些相关的概念:

一、UIView的bounds属性

定义了一个矩形,描述了一个UIView的位置和大小,注意,其参照系统是自身,所以bounds.origin属性默认是(0, 0),而bounds.size的和frame.size是一致的,该属性主要用在与视图绘制有关的方法中。所有绘制在bounds的范围内的的东西都是该视图的可见内容,如果更改了bounds.origin的位置,那么绘制在新位置的东西将会成为视图新的可见内容(bounds.origin会不会一直还是0,0?)

二、UIView的frame属性

同样也是定义了一个矩形,描述一个UIView的大小和位置,但与bounds属性不同,其参照系统是其父视图(superview)的坐标系统。该属性主要用在控制视图的几何变换中(如视图位置改变、大小改变)。

三、UIView的center属性

该属性用于确定一个视图的中心点位置,其参照系和frame属性一样,是其父视图的坐标系统。该属性的一个作用是对视图进行放大、缩小或旋转时,该属性的值不会变,所以可以用来控制视图的位置。反而,如果使用frame属性的话,该属性下的origin和size的值是会变化的,所以当视图发生变化时,难以用来控制视图的位置。

四、一些特性

1、改变frame属性会同时影响bounds属性和center属性

2、改变center属性会影响frame属性的origin值

3、改变bounds属性的size值会影响frame属性的size值(bounds属性的origin属性呢?待做一下实验)

4、关于视图剪切的说明,如果子视图有部分超出了父视图,那么超出部分同样会被绘制,除非父视图设置了clipsToBounds属性;同时,无论如何,子视图超出父视图的那一部分,都不会响应该子视图的触碰事件。

5、坐标系统的转换:可以通过仿射转换(Affine Transform)来对一个视图的坐标系统进行一些变换,从而实现视图的缩放、旋转等功能,但要注意两点,所有对某一个视图的仿射转换都是针对其center为参照的;二是仿射转换虽然可以改变视图的大小和方向等,但都是针对其父视图而言的,对于应用了仿射的视图来说,实际上是定义了一种坐标对应的变换关系,也就是说,它的frame等属性实际上并没有改变(待做实验)。因此,一些位置、大小等持久化的改变不宜用仿射变换来实现,还是应当通过改变frame属性、center属性等方式来实现。但临时的变换,如制作旋转动画,使用仿射转换都是一个不错的选择。

仿射变换的两种实现方式:
(1)对整个视图应用变换,可以使用视图的setTransForm:方法。
(2)对视图的局部绘制做变换,可以使用视图的drawRect: 方法,前提是先对相应的图形上下文( Graphics Context)进行变换。此外,使用视图的drawRect方法还有一个作用,就是用它来实现视图的位置或大小改变。我们只要指定一中转换关系,在指定的位置绘制视图,就可以达到改变视图大小和位置的相同效果,而且这样做效率还更高。同时,应为drawRect方法应用的是视图的bounds属性,永远是从坐标零点开始绘制,所以使用起来也更加的简便。下面是关于仿射变换的两张图,有助于理解:

ios坐标系统的更多相关文章

  1. iOS--------坐标系统(UIView的frame、bounds跟center属性)

    1.概要翻开ios官方开发文档,赫然发现上面对这三个属性的解释如下: frame:描述当前视图在其父视图中的位置和大小. bounds:描述当前视图在其自身坐标系统中的位置和大小. center:描述 ...

  2. Object-C基础

    cocoa 类: 传统的写法:Demo.h // // Demo.h // demoClass // // Created by 王 on 13-12-16. // Copyright (c) 201 ...

  3. 详解UIView的frame、bounds和center属性

    From: http://ios.wpjam.com/2011/08/29/uiview-frame-bounds-center/ 1.概要 翻开ios官方开发文档,赫然发现上面对这三个属性的解释如下 ...

  4. iOS面试必看

    转载:http://www.jianshu.com/p/5d2163640e26 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形 ...

  5. iOS的一像素线

    文/stark_yang(简书作者)原文链接:http://www.jianshu.com/p/b83dca88ef73著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 时常总结以前学过 ...

  6. iOS面试题集锦

    一.前言部分 文中的问题多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.怎样防止指针的越界使用问题? 答案: 1 .防止数组越界,必须让指针指向一个有效的内存地址, 2. 防止向一块内存中拷 ...

  7. IOS开发基础知识--碎片20

    1:view中的clipsTobounds属性 iew2添加view1到中,如果view2大于view1,或者view2的坐标不全在view1的范围内,view2是盖着view1的,意思就是超出的部份 ...

  8. iOS开发工程师面试题(二)

    1.手写冒泡跟插入排序 冒泡排序来源于生活常识,相当于把数组竖起来,轻的向上,重的向下.void bubbleSort(int[] unsorted) { ; i < unsorted.Leng ...

  9. [转]iOS开发中的火星坐标系及各种坐标系转换算法

     iOS开发中的火星坐标系及各种坐标系转换算法 源:https://my.oschina.net/u/2607703/blog/619183   其原理是这样的:保密局开发了一个系统,能将实际的坐标转 ...

随机推荐

  1. timewrap 算法

    何为延迟补偿?如何进行坐标差值?B客户端屏幕上A已经跑到东边了,但是收到服务器说"A正在西边往北跑",B到底该何去何从?我若干年前的一个实现版本,将简明扼要的解决这个问题: 影子跟 ...

  2. IP服务-6-SNMP

    SNMP(简单网络管理协议) SNMP更为正式的说法是互联网标准管理框架(Internet Standard Management Framework).在这个协议架构中.被管理的设备(SNMP代理) ...

  3. [题解](gcd/lcm)luogu_P1072_Hankson的趣味题(NOIP2009)

    连续三次不开longlong导致wa!!! 不开longlong一时爽,一会提交火葬场!!! OI千万条,longlong第一条 乘法不longlong,提交两行泪 暴力luogu就能过了???打好暴 ...

  4. zabbix图表中文乱码

    如果语言改成中文,在图表中的中文会乱码,这是因为zabbix默认的字体文件比较烂 方法就是把字体文件替换,找到zabbix前端文件地址,换一个字体文件就好 [root@webmaster fonts] ...

  5. SNMP消息传输机制

    1.引言 基于TCP/IP的网络管理包含3个组成部分: 1) 一个管理信息库MIB(Management Information Base).管理信息库包含所有代理进程的所有可被查询和修改的参数.RF ...

  6. Java内置锁和简单用法

    一.简单的锁知识 关于内置锁 Java具有通过synchronized关键字实现的内置锁,内置锁获得锁和释放锁是隐式的,进入synchronized修饰的代码就获得锁,走出相应的代码就释放锁. jav ...

  7. Ubuntu下修改权限时出现"unable to execute /bin/chmod: Argument list too long"

    Ubuntu14.04下修改权限时出现"unable to execute /bin/chmod: Argument list too long"   ,大概意思是卧槽,你这参数也 ...

  8. 深度学习中GPU和显存分析

    刚入门深度学习时,没有显存的概念,后来在实验中才渐渐建立了这个意识. 下面这篇文章很好的对GPU和显存总结了一番,于是我转载了过来. 作者:陈云 链接:https://zhuanlan.zhihu. ...

  9. 根据Content获取到ItemsControl中对应的Item

    /// <summary> /// 根据控件的值获取到对应的Item /// </summary> /// <typeparam name="T"&g ...

  10. kafka java api消费者

    import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Properties; imp ...