在IOS开发中三个基本属性frame、bounds和center的解惑

2023-11-20 20:50

本文主要是介绍在IOS开发中三个基本属性frame、bounds和center的解惑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在IOS开发中三个基本属性frame、bounds、center的解惑

在IOS开发中,对许许多多的初学者来说,这三个属性还有很大的困惑,我当初也是如此。当然尽管很多IOS开发者有多年开发经验,但是也还是有很多人对这几个属性不是很清楚,没有从本质上理解它们。下面我们就来说说这三个属性。


首先说说坐标系的概念。在IOS开发中,坐标系分为绝对坐标系和相对坐标系。
绝对坐标系:在IOS开发中,这个绝对坐标系的原点就是屏幕左上角这个点,也就是根视图View的左上角,而这个根视图优势所有View的父控件,所以,所有控件归根到底还是参考绝对坐标系的原点。这个绝对坐标系,对应于我们的三个属性中的frame属性。


相对坐标系:相对坐标,都是基于一个对象作参考而言的。在IOS开发中,这个相对坐标是相对于控件自身而言,以自身为参考,这个相对坐标的原点就是控件自身的左上角。这个相对坐标,对应于我们的三个属性中的bounds属性。


这个frame是一个CGRect类型的结构体。这个结构体是由一个点和基于这个点的宽和高组成的一个矩形区域。它里面的(x,y)是参考绝对坐标的原点,用于确定控件的位置,它里面的(width,height)是参考它里面的点,用于确定控件的宽和高,也就是确定了控件的大小,这个一个控件的位置和尺寸就都确定了。


这个bounds也是一个CGRect类型的结构体,但是他的(x,y)都为0,虽然网上都说它的值永远是0,不可以更改,但是这是不正确的。后面我会说为什么错。bounds也有(width,height),这和frame没什么区别。bounds是相对坐标系中的,它以控件本身左上角为参考点,所以导致它的(x,y)都是0。所以,通过bounds只能改变控件的大小,不能改变它的位置。


这个center是一个CGPoint类型的一个点,代表控件的中心点。它是参考绝对坐标系的原点而言的。既然只是一个点,那么它就只能改变控件的位置,而不能改变控件的大小。


总结:frame:相对于绝对坐标系而言,以屏幕左上角为原点,能改变控件的位置和尺寸;
        bounds:相对于相对相对坐标系而言,以控件自身的左上角为原点,只能改变控件的尺寸;
                   center:相对于绝对坐标系而言,以屏幕左上角为原点,只能改变屏幕位置;


下面说一下frame和bounds的底层:
frame主要是确定控件自身的位置,如果要确定自己的子控件位置,都要参考绝对坐标的话,那将是一个非常麻烦的事情,千千万万的控件,大量的位置和尺寸的计算,显然效率很低,这就有了bounds的诞生,bounds就是为了子控件作用的,也就是说子控件的位置基本上都是通过父控件的bounds去确定的,这样省去了多级父子控件之间的结算,直接把位置信息连成一条线去控制控件位置。


那么,父控件是怎么确定的子控件的位置的呢?bounds主要就是通过修改控件自身的(x,y)去影响自己子控件的位置。当我们放一个宽和高都为300的view控件,在把一个宽和高都是100的子控件view大view之上,让他们左下角重合(这样结果容易计算),当我们把大view的bounds的x和y都设置为100的时候,运行程序,我们会发现,子控件小view朝左上角x方向移动100,y方方向也移动100,那为什么父控件的x和y都加100,而子控件却向反方向移动呢?这正是很多小白乃至很多开发者困惑的地方。其实,当我们把父控件的x和y都设置为100的时候,相当于当前的(0,0)点变成了(100,100)这个点,那么,相对于这个点,原先的(0,0)点就朝左上角移动了(-100,-100),而此时的之空间依然是相对于父控件的之前的原点(0,0)来确定位置的,而不是以新的(100,100)为原点。所以,要想相对父控件的原点的位置不变,就要朝左上角移动到相对于当前的(0,0)点不变的位置。这就是修改父控件的bounds的xy影响子控件的位置的详细说明。
由于本人水平有限,表达欠妥,错误在所难免,欢迎各位大神批评指正,本人不胜感激,同时本人也忠心的希望此博客能帮助一些人。


这篇关于在IOS开发中三个基本属性frame、bounds和center的解惑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/397358

相关文章

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

SpringBoot整合MybatisPlus的基本应用指南

《SpringBoot整合MybatisPlus的基本应用指南》MyBatis-Plus,简称MP,是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,下面小编就来和大家介绍一下... 目录一、MyBATisPlus简介二、SpringBoot整合MybatisPlus1、创建数据库和

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

基于Python开发PDF转PNG的可视化工具

《基于Python开发PDF转PNG的可视化工具》在数字文档处理领域,PDF到图像格式的转换是常见需求,本文介绍如何利用Python的PyMuPDF库和Tkinter框架开发一个带图形界面的PDF转P... 目录一、引言二、功能特性三、技术架构1. 技术栈组成2. 系统架构javascript设计3.效果图

HTML5 data-*自定义数据属性的示例代码

《HTML5data-*自定义数据属性的示例代码》HTML5的自定义数据属性(data-*)提供了一种标准化的方法在HTML元素上存储额外信息,可以通过JavaScript访问、修改和在CSS中使用... 目录引言基本概念使用自定义数据属性1. 在 html 中定义2. 通过 JavaScript 访问3.