【iOS】frame与bounds区别

文章目录

  • 前言
  • frame
  • bounds
  • 两者区别
  • size的区别
  • 总结


前言

在学习响应者链的过程中用到了frame与bounds的混用,这两个属性经常出现在我们的开发中,特别撰写一篇博客分析区别

首先,我们来看一下iOS特有的坐标系,在iOS坐标系中以左上角为坐标原点,往右为X正方向,往下是Y正方向如下图:
在这里插入图片描述

我们来看一下frame与bounds在文件中的定义

bounds
在这里插入图片描述
默认边界为原点0,frame大小。可以做成动画

frame
在这里插入图片描述
可以做成动画。如果视图被转换,不要使用frame,因为它不能正确反映视图的实际位置。使用bounds + center代替

同时可以看到他们都是CGRect结构体

struct CGRect {CGPoint origin;CGSize size;
};

origin决定了view的起点,size决定View的尺寸

frame

frame描述的是视图相对于它的父视图的坐标系统中的位置和大小。它包含一个CGRect值,定义视图的原点位置和宽高。

  • 坐标系:父视图的坐标系。
  • 内容:包含视图的原点相对于父视图的位置,以及视图的宽度和高度。
  • 应用:适合在父视图中设置视图的位置和大小

来看一段Demo

UIView *viewA = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 300, 300)];
[viewA setBackgroundColor:[UIColor blueColor]];
[self.view addSubview:viewA];
NSLog(@"viewA - %@",NSStringFromCGRect(viewA.frame));UIView *viewB = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
[viewB setBackgroundColor:[UIColor yellowColor]];
[viewA addSubview:viewB];
NSLog(@"viewB - %@",NSStringFromCGRect(viewB.frame));UIView *viewC = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[viewC setBackgroundColor:[UIColor redColor]];
[self.view addSubview:viewC];
NSLog(@"viewC - %@",NSStringFromCGRect(viewC.frame));

输出:
在这里插入图片描述

在这里插入图片描述
以上可以看出,viewB和viewC的起点重合
但是从打印结果来看,viewB的起点为(50,50),而viewC的起点为(100,100)
原因就是frame中的位置是以父视图的坐标系为标准来确定当前视图的位置
viewB的父视图为viewA,viewC的父视图为self.view,而由于viewA的起点为(50,50),所以viewB与viewC起点才会重合。

bounds

我们再打印一下bounds

    UIView *viewA = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 300, 300)];[viewA setBackgroundColor:[UIColor blueColor]];[self.view addSubview:viewA];NSLog(@"viewA - %@",NSStringFromCGRect(viewA.bounds));UIView *viewB = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];[viewB setBackgroundColor:[UIColor yellowColor]];[viewA addSubview:viewB];NSLog(@"viewB - %@",NSStringFromCGRect(viewB.bounds));UIView *viewC = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];[viewC setBackgroundColor:[UIColor redColor]];[self.view addSubview:viewC];NSLog(@"viewC - %@",NSStringFromCGRect(viewC.bounds));

在这里插入图片描述
可以看到bounds的起点都是0

这也符合文档中的说明默认边界为原点0,frame大小。可以做成动画

每个视图都有自己的坐标系,且这个坐标系默认以自身的左上角为坐标原点,所有子视图以这个坐标系的原点为基准点。
bounds的位置代表的是子视图看待当前视图左上角的位置,bounds的大小代表当前视图的大小。

  • 修改frame会改变视图在父视图中的位置。
  • 修改bounds不会改变视图在父视图中的位置,只会改变其内部内容的绘制区域,也就是会改变子视图的位置、

两者区别

在这里插入图片描述
此时,如果我们把ViewAbounds改为(0,100),结果如下:
在这里插入图片描述
此时父视图左上角不再是(0,0),而是(0,50),因此子视图才会往上移动

size的区别

frame的size直接决定了view的大小,而bounds的size修改后,view的中心点不变,长宽以中心点进行缩放

看Demo:

    UIView *viewA = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 300, 300)];[viewA setBackgroundColor:[UIColor blueColor]];viewA.bounds = CGRectMake(50, 50, 300, 300);[self.view addSubview:viewA];NSLog(@"viewA - %@",NSStringFromCGRect(viewA.bounds));

在这里插入图片描述
修改bounds为CGRectMake(50, 50, 100, 100)在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
中心点没变,只是中心点进行了缩放

总结

坐标系不同
frame父视图坐标系,用于确定视图在父视图中的位置。
bounds自身坐标系,用于描述视图内容区域的布局。
位置与布局
frame用于确定视图在父视图中的整体位置和大小。
bounds修改origal自身不变化,会影响子视图,修改size以自身中心点进行缩放

参考博客:frame与bounds的区别详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/687479.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM 可以从简单数据中学习吗?

在 10 月份的一次周会结束后,我提到 SFT 训练后的 Loss 曲线呈现阶梯状,至于为什么,并没有人有合理的解释,加上当时的重心是提升次日留存率,Loss 曲线呈现阶梯状与次日留存率的关系还太远,即使有问题&#…

Java练手项目 个人学习等选题参考

难度系数说明: 难度系数用来说明项目本身进行分析设计的难度 难度系数大于1的项目是非常值得反复学习的,从项目中成长 前言 大家好,我是二哈喇子,此博文整理了各种项目需求 要从本篇文章下的项目中学习的思路: 用的…

基于STM32F401RET6智能锁项目(使用库函数点灯、按键)

点灯硬件原理图 1、首先,我们查看一下原理图,找到相对应的GPIO口 LED_R低电平导通,LED4亮,所以LED_R的GPIO口需要配置一个低电平才能亮; LED_G低电平导通,LED3亮,所以LED_R的GPIO口需要配置一…

防爆气象仪

TH-WFB5矿山作为一个特殊的工作环境,其安全生产一直是重中之重。而矿山环境中的气象变化,如温度、湿度、风速、风向等,不仅直接影响矿山的日常生产活动,还关系到矿工的生命安全。因此,防爆气象仪的应用显得尤为重要。 …

陪玩系统APP小程序H5音视频社交系统陪玩系统源码,陪玩app源码,陪玩源码搭建陪玩社交系统开发(现成,可定制)线下陪玩系统项目开发搭建

线下陪玩系统项目的设计 在需求分析完成后,接下来进行系统设计。系统设计主要包括以下几个部分: 1. 数据库设计:根据需求分析的结果,设计数据库结构,包括用户信息表、服务信息表、订单信息表等。 2. 界面设计&#…

激光雷达:盲人世界的导航灯塔

在科技日新月异的今天,一项名为“蝙蝠避障”的创新成果,正悄然改变着盲人朋友的日常生活,特别是在出行这一领域,它的应用如同一束光,照亮了前行的道路。本文将深入探讨激光雷达技术对盲人的帮助,揭示这项高…

虚拟化技术 分离虚拟机数据流量与ESXi的流量管理

一、实验内容 为ESXi主机添加网卡通过vClient查看已添加的网卡信息为ESXi添加网络,创建标准交换机修改网络配置,实现虚拟机数据流量与ESXi的管理流量分离 二、实验主要仪器设备及材料 安装有64位Windows操作系统的台式电脑或笔记本电脑,建…

探索震坤行API:一键解锁高效工业用品采购新纪元!

震坤行是一家专注于工业用品的B2B电商平台,为企业客户提供一站式的工业用品采购服务。虽然震坤行没有直接公开通用的API接口供开发者调用,但通常大型企业或合作伙伴之间可以通过API进行系统集成和数据交互。以下是一个假设性的震坤行API接口调用示例与代…

如何使用 ERNIE 千帆大模型基于 Flask 搭建智能英语能力评测对话网页机器人(详细教程)

ERNIE 千帆大模型 ERNIE-3.5是一款基于深度学习技术构建的高效语言模型,其强大的综合能力使其在中文应用方面表现出色。相较于其他模型,如微软的ChatGPT,ERNIE-3.5不仅综合能力更强,而且在训练与推理效率上也更高。这使得ERNIE-3…

VBA在Excel中登录页面的应用—动态密码设置

https://mp.weixin.qq.com/s?__biz=MzkwMzY1OTIzOA==&mid=2247484420&idx=1&sn=5f98ef156cd6a784f0b1e64eed11ee42&chksm=c093af8df7e4269bdda3ed4adc37ce5f30707760ad42a2e0c6c3278ff0a0c5fcaf890016f9b5&token=1012529499&lang=zh_CN#rd 文章目录 …

Yolov8目标检测——在Android上部署Yolov8 tflite模型

1. 简介 YOLOv8 是一种用于目标检测的深度学习模型,它是 YOLO(You Only Look Once)系列的最新版本之一。YOLO 系列因其高效和准确性而在计算机视觉领域非常受欢迎,特别是在需要实时目标检测的应用中,如视频监控、自动…

C++ BuilderXE 计算程序运行时间精确到毫秒

#include <time.h> // //计算时间 clock_t start,end,dtStart; startclock(); // ProgressBar1->Percent0; // // ProgressBar1->Percenti/DDnum*100; // Application->ProcessMessages(); // //操作完成计时 …