在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

相关文章

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

无线路由器哪个品牌好用信号强? 口碑最好的三个路由器大比拼

《无线路由器哪个品牌好用信号强?口碑最好的三个路由器大比拼》不同品牌在信号覆盖、稳定性和易用性等方面各有特色,如何在众多选择中找到最适合自己的那款无线路由器呢?今天推荐三款路由器让你的网速起飞... 今天我们来聊聊那些让网速飞起来的路由器。在这个信息爆炸的时代,一个好路由器简直就是家庭网编程络的心脏。无论你

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

C#图表开发之Chart详解

《C#图表开发之Chart详解》C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对... 目录OverviChina编程ewSeries类总结OverviewC#中,开发图表功能的控件是Char

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE