---恢复内容开始---

本文转发至:http://www.xuebuyuan.com/1846606.html

在写程序的时候发现,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属性,永远是从坐标零点开始绘制,所以使用起来也更加的简便。下面是关于仿射变换的两张图,有助于理解:

参考文章:View Programming Guide for iOS

---恢复内容结束---

转载于:https://www.cnblogs.com/tmf-4838/p/5294013.html

iOS下bound,center和frame相关推荐

  1. iOS学习笔记:frame,bound,center, anchorPoint

    frame: View在它的Super View坐标系里的坐标 bound: 用来定义View自身坐标系和边界的Rect,Rect的原点表示View自身坐标系的原点坐标.举个例子: 一般情况下boun ...

  2. iOS下JS与OC互相调用(五)--UIWebView + WebViewJavascriptBridge

    WebViewJavascriptBridge是一个有点年代的JS与OC交互的库,使用该库的著名应用还挺多的,目前这个库有7000+star.我去翻看了它的第一版本已经是4年前了,在版本V4.1.4以 ...

  3. iOS下JS与OC互相调用(一)--UIWebView 拦截URL

    1.在JS 中做一次URL跳转,然后在OC中拦截跳转.(这里分为UIWebView 和 WKWebView两种,去年因为还要兼容iOS 6,所以没办法只能采用UIWebView来做.) 2.利用WKW ...

  4. iOS下JS与OC互相调用(六)--WKWebView + WebViewJavascriptBridge

    2019独角兽企业重金招聘Python工程师标准>>> iOS下JS与OC互相调用(六)--WKWebView + WebViewJavascriptBridge 转载:原地址 ht ...

  5. ios 下拉菜单Menu

    ios 下拉菜单Menu 看了很多的demo,看到思路大致相同.手动模仿写一个. DropdownMenu.h #import <UIKit/UIKit.h>@class Dropdown ...

  6. 仿Ios下拉菜单,android Spinner效果(美团下拉效果)

    先上效果图: 直接上代码: Ios spinner文件 package com.choe.iosspinner;import android.app.Activity; import android. ...

  7. IOS下利用OpenCV框架去除视频水印

    想做个去水印的APP,第一个想到的就是CV里的inpaint图像修复技术.就想着把CV框架放在IOS中用,由于第一次接触IOS的开发,就看了两本实习时候导师大神推荐的书,很多东西都不太了解,虽然CV官 ...

  8. IOS下实现高性能画板橡皮擦的办法

    摘要 IOS下使用CAShapeLayer+UIBezierPath实现互动画板时橡皮擦的实现方式. 背景 要在IOS端做一个在线教育DEMO,集成音视频互动.PPT白板互动.聊天等功能. 画板实现 ...

  9. Mac下python3配置opencv3 3和Mac下单独opencv的配置以及iOS下配置opencv

    #1.Mac下python3配置opencv3.3 新手受任开发一个功能,需要用到opencv.但python和opencv连接出现问题,看了大概有上百份博客的解决办法,都没有解决,快要放弃了,解决了 ...

最新文章

  1. html5移动端根据百度地图api获取详细地址
  2. tf.data.Dataset.from_tensor_slices 的用法
  3. Java单元测试-快速上手Junit
  4. python中split的用法取第二个分片_python中split()函数的用法
  5. Win32 ASM 简单对话框编程Demo
  6. 斐波那契数列的递归实现
  7. 虚幻引擎学习之路:粒子系统篇(二)
  8. 最牛营业部——国信泰然九路揭秘
  9. [CareerCup] 13.10 Allocate a 2D Array 分配一个二维数组
  10. 30分钟学玩转RabbitMQ
  11. 《软件需求分析(第二版)》第 3 章——需求工程的推荐方法 重点部分总结
  12. opencv 阈值分割_用 OpenCV 去除图片中的水印,骚操作!
  13. 六度人和张星亮:SaaS市场要回归TO B本质
  14. 微信小程序学习总结(一)——程序文件内容
  15. es 1.7 ik 配置
  16. 国产操作系统之统信UOS安装
  17. 下载VS(visualstudio)2019官方网站详解
  18. 腾讯会议使用OBS虚拟摄像头
  19. 调用方法求出数组两个元素的和
  20. 傅里叶变换的通俗理解

热门文章

  1. java.lang.RuntimeException: Expected one of local, maven-local, maven-central, scala-tools-releases,
  2. hadoop错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster
  3. Python游戏开发:最强大脑第一关,数字华容道
  4. android点击事件注册方式,Android界面控件(3)— 注册同一个点击事件的监听器...
  5. vps建网站python_VPS配置python web环境真吐血
  6. 微软宣布 Power Fx 开源
  7. 迁移学习之ResNet50和ResNet101(图像识别)
  8. HDU4920(矩阵连乘)
  9. mysql cronjob 备份_mysql 数据备份 crontab
  10. 金蝶加密服务器显示339错误,打开金蝶软件出现这个提示怎么解决???