iOS——frame和bounds的区别
把frame理解为占用区域,把bounds理解为边界。View在旋转过程中,其实自己的坐标系统并没有发生改变,bounds中的origin只能通过setBounds方法修改。
frame 定义了视图在其父视图坐标系统中的位置和大小。其坐标系是相对于俯视图的坐标系。
bounds 定义了视图自身坐标系统中的位置和大小。其坐标系是相对于自己本身视图的坐标系。
UIView.h中的注释:
// 如果视图进行了变换,不要使用 frame,因为它不会正确反映视图的实际位置。使用 bounds + center 代替。
@property(nonatomic) CGRect frame;// 如果非恒等变换,请使用 bounds/center 而不是 frame。
@property(nonatomic) CGRect bounds; // 默认 bounds 是原点为零,大小为 frame 的大小。
@property(nonatomic) CGPoint center; // center 是 frame 的中心,相对于 anchorPoint。
- bounds的x,y是根据自己的坐标系统而言的。没错,每个view都有自己的坐标系。以自己左上角点为坐标原点。所以bounds的x,y默认为(0,0),除非调用
setBounds方法; - frame的size不一定等于bounds的size,在旋转后它们的size就不一样了。
有如下示例:
- (void)viewDidLoad {[super viewDidLoad];UIButton *animateButton = [UIButton buttonWithType:UIButtonTypeSystem];animateButton.frame = CGRectMake(100, 250, 100, 50);[animateButton setTitle:@"Animate" forState:UIControlStateNormal];[animateButton addTarget:self action:@selector(startAnimation) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:animateButton];self.fView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];[self.view addSubview:self.fView];self.fView.backgroundColor = [UIColor orangeColor];self.sView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];[self.fView addSubview:self.sView];self.sView.backgroundColor = [UIColor blueColor];NSLog(@"Bounds:");NSLog(@"fView x:%f; sView x:%f", self.fView.bounds.origin.x, self.sView.bounds.origin.x);NSLog(@"fView y:%f; sView y:%f", self.fView.bounds.origin.y, self.sView.bounds.origin.y);NSLog(@"frame:");NSLog(@"fView x:%f; sView x:%f", self.fView.frame.origin.x, self.sView.frame.origin.x);NSLog(@"fView y:%f; sView y:%f", self.fView.frame.origin.y, self.sView.frame.origin.y);
}- (void) startAnimation {[self.fView setBounds:CGRectMake(60, 60, 100, 100)];NSLog(@"Bounds:");NSLog(@"fView x:%f; sView x:%f", self.fView.bounds.origin.x, self.sView.bounds.origin.x);NSLog(@"fView y:%f; sView y:%f", self.fView.bounds.origin.y, self.sView.bounds.origin.y);NSLog(@"frame:");NSLog(@"fView x:%f; sView x:%f", self.fView.frame.origin.x, self.sView.frame.origin.x);NSLog(@"fView y:%f; sView y:%f", self.fView.frame.origin.y, self.sView.frame.origin.y);
}
点击按钮我们发现,明明更改的是fView的bounds,为什么fView的位置没变,但是sView的位置向左上了呢?
其实setBounds中的(x,y)只改变自己的坐标系统,子View的bounds和frame并不会改变;
setBounds是修改自己坐标系的原点位置,进而影响到子View的显示位置;
bounds改变位置时,改变的是子视图的位置,自身没有影响,其实就是改变了自身的坐标系原点,默认原点在左上角。
因此执行完setBounds后,实际上是将当前fView的视图的原点移到了相对于原来原点的(60,60)位置,但是由于fView设定的frame是(100,100),因此它本身的frame不变,只是相当于移动了坐标系往左上了。又因为sView是fView的子视图,sView的frame是相对于fView的坐标系来设定位置的,因此,sView还是处于相对于fView的(0,0)位置,因此我们看上去sView的位置就像是随着fView的坐标系一起向左上移动了,但实际上sView的frame没有改变,打印出来还是(0,0)。
总结
frame: 描述视图在其父视图中的位置和大小,是“绝对”的。
bounds: 描述视图自身的内容区域和尺寸,是“相对”的。
相关文章:
iOS——frame和bounds的区别
把frame理解为占用区域,把bounds理解为边界。View在旋转过程中,其实自己的坐标系统并没有发生改变,bounds中的origin只能通过setBounds方法修改。 frame 定义了视图在其父视图坐标系统中的位置和大小。其坐标系是相对于俯视图的坐标系。 bou…...
Trm理论 3(注意力机制)
注意力机制(attention) 在使用LSTM,CNN等模型的时候,很难决定对于一个信息什么是重要的,什么是不重要的。因此注意力机制就是为了优化这一问题 怎么做注意力机制 注意力机制包含,查询对象(Q&…...
Vue2和Vue3项目创建的区别和 element ui 和element plus的导入方式
文章目录 创建项目Vue2Vue3 Vue2项目机构Vue 2 Element UI VUE3项目结构Vue 3 Element Plus 创建项目 Vue2 Vue CLI 3 及之前版本: 使用 vue-cli 创建项目: npm install -g vue/cli vue create my-project-vue2 cd my-project-vue2Vue3 Vue CLI 4…...
基于STM32的猫狗宠物喂养系统设计(微信小程序)(215)
文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】设计实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要【5】选题背景【6】国内外技术发展现状【7】研究的目…...
spark读取csv文件
测试spark读取本地和hdfs文件 from pyspark.sql import SparkSessionspark SparkSession.builder \.appName("Example PySpark Script") \.getOrCreate()# 读取本地csv文件 df spark.read.csv("/Users/xiaokkk/Desktop/local_projects/spark/intents.csv&quo…...
钢铁百科:Q420DR力学性能、Q420DR执行标准、Q420DR低温容器钢板
Q420DR钢板是一种专为低温压力容器设计的优质钢材,其材质特性、执行标准、化学成分、力学性能、交货状态、应用范围以及常用规格等方面都具有显著的特点。 一、Q420DR钢板材质 Q420DR钢板的命名方式体现了其材质特性。其中,“Q”代表屈服强度ÿ…...
三菱机器人手柄维修示教器维修手操器面板等
机器人手柄维修(示教器维修)故障现象包括:黑屏、指示灯无任何显示, 上电蓝屏、白屏,通电几分钟后屏幕变为蓝屏,主板故障,通讯时有时无, 触摸失灵,有时白屏,触…...
中间件的学习理解总结
目录 一、定义与作用 二、主要类型 数据库中间件 远程过程调用中间件 面向消息的中间件 事务处理中间件 三、特点与优势 独立性 高效性 可扩展性 可靠性 四、应用场景 企业应用集成 分布式系统 电子商务 移动应用开发 五、数据库中间件 功能细节:…...
编程秘密武器:提升工作效率的关键工具
在编程的世界里,选择合适的工具可以极大地提升工作效率。无论是智能的代码编辑器、强大的版本控制工具,还是自动化脚本,这些“秘密武器”都能帮助开发者在繁忙的工作环境中事半功倍。本文将探讨一些能显著提升工作效率的编程工具,…...
Git+word记笔记
程序员记笔记主要同步很重要,我这个方法只支持个人笔记,如果团队还是用企业微信开个企业会员比较方便。为什么用word,因为可以镶嵌代码和文档,不仅仅是文字,兼容性强 语雀,云笔记这些对于上传的word都是有…...
java-antrl手敲命令的hello world
java-antrl手敲命令的hello world 环境步骤1. 下载ANTLR的jar包2. 新建一个g4文件3. 生成语法对应的java文件4. 编译语法对应的java文件5. 测试语法5.1 打印测试信息5.2 查看语法分析树 6. 注意事项6.1 每一个antlr4版本的jar包都对应java的相应版本,要对应。6.2 [1…...
法规探讨 | 《医疗器械管理法(草案征求意见稿)》初探(1)
昨日,国家药监局综合司正式公开征求《中华人民共和国医疗器械管理法(草案征求意见稿)》的意见,标志着我国医疗器械管理领域即将进入新的发展阶段。相较于现行的《医疗器械监督管理条例》,《医疗器械法》不仅沿袭了《条…...
大语言模型的上下文窗口(Context Windows):对人工智能应用的影响
大语言模型(LLMs)极大地提升了人工智能在理解和生成类人文本方面的能力。其中一个影响其效用的基本方面是它们的 “上下文窗口”—— 这个概念直接影响着这些模型接收和生成语言的有效性。我将深入探讨上下文窗口是什么、它们对人工智能应用的影响以及组…...
Java【数组】
数组是一组类型相同的数据(基本类型或引用类型)的集合,数组中每个数据称为元素。数组也是Java的对象,一旦创建,数组长度就固定了。 创建数组 1.声明一个数组类型的引用变量(数组变量)ÿ…...
xAI巨无霸超级计算机上线:10万张H100 GPU,计划翻倍至20万张
在短短四个多月的时间里,埃隆马斯克的X公司(前身为Twitter)推出了世界上最强劲的人工智能训练系统。名为Colossus的超级计算机使用了多达10万张NVIDIA H100 GPU进行训练,并计划在未来几个月内再增加5万张H100和H200 GPU。 “本周末…...
python集合
1. 请解释Python中的集合(set)是什么? Python中的集合(set)是一个无序的、不重复的元素序列。它的主要用途是进行成员关系测试和消除重复元素。集合对象还支持数学运算,如并集、交集、差集和对称差分。 以…...
算法打卡 Day29(回溯算法)-复原 IP 地址 + 子集 + 子集 Ⅱ
文章目录 Leetcode 93-复原 IP 地址题目描述解题思路 Leetcode 78-子集题目描述解题思路 Leetcode 90-子集 Ⅱ题目描述解题思路 Leetcode 93-复原 IP 地址 题目描述 https://leetcode.cn/problems/restore-ip-addresses/description/ 解题思路 这是一道切割问题,…...
LeetCode 热题100-17 缺失的第一个正数
缺失的第一个正数 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: 输入:nums [1,2,0] 输出:3 解释:范围 [1,…...
基于CloudflareSpeedTest项目实现git clone加速
1.网络测速 「自选优选 IP」测试 Cloudflare CDN 延迟和速度,获取最快 IP 更多内容参考项目:https://github.com/XIU2/CloudflareSpeedTest 国外很多网站都在使用 Cloudflare CDN,但分配给中国内地访客的 IP 并不友好(延迟高、丢…...
对与单纯post方法写项目的修改成baseservlet方法
解决的问题: 1.用baseservlet方法来写: 我之前没听明白gsa讲的那些,然后自己写了注册,用的post方法,就是那个叫我们最好不要用有点low的方法,后面与别人交流后发现是要用baseservlet来写,叫他…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
