当前位置: 首页 > news >正文

UIButton的UIEdgeInsetsMake属性(setTitleEdgeInsets,setImageEdgeInsets)

一.UIEdgeInsetsMake的四个属性

UIEdgeInsetsMake 有四个属性,依次是 Top,left,bottom,right

[Btn setTitleEdgeInsets:UIEdgeInsetsMake( top,  left,  bottom,  right)];

四个属性的默认值为0,拿其中一个left属性来聊, 你可以理解为文字距离Btn左边界的“位移”是0,

如果给left一个正值(例如40),即说明 文字距离左边界位增加了40个距离(即向右边移动了40个距离).

(注意⚠️:这个左边界不是btn的左边,而是btn.titleLabel 的左边)

对比下图,红色Btn设置了属性[redbBtn setTitleEdgeInsets:UIEdgeInsetsMake(0, 40, 0, 0)];

即红色Btn的文字距离左边界位增加了40个距离(即向右边移动了40个距离).

如果给left一个负值(例如-40),即说明 文字距离左边界位增加了-40个距离(即向左边移动了40个距离).

如下图:

由以上两个示例我们可以得出结论:

1.给left设置正值,则title往右边移动,即距离左边界移动xx距离(原本默认距离为0);给left设置负值,则title往左边移动.

以此类推,其他3个属性也是这样.设置top正值,title往下边移动,设置负值,title往上边移动……

如果同时给left和right都设置相同的正值,则实际上title不移动:

给left设置了正值40,往右移动

[redbBtn setTitleEdgeInsets:UIEdgeInsetsMake(0, 40, 0, 0)];

给right设置了正值40,往左移动

[redbBtn setTitleEdgeInsets:UIEdgeInsetsMake(0, 0, 0, 40)];

一左一右都移动40,等同于不移动

总之,明白了属性的道理,上左下右各种组合你就慢慢玩吧.

以上是btn的文字title的处理,Btn的iamgeView也是这个意思.

那么文字+图片该怎么设置呢?

二.文字+图片

同时给Btn设置了文字和图片,系统默认图片在左,文字在右. 而且还是仅仅挨着的:

    UIButton * redbBtn = [[UIButton alloc]initWithFrame:CGRectMake(100, 200, 150, 80)];redbBtn.backgroundColor = [UIColor redColor];[redbBtn setTitle:@"Btn文字" forState:UIControlStateNormal];[redbBtn setImage:[UIImage imageNamed:@"new_delete"] forState:UIControlStateNormal];[self.view addSubview:redbBtn];

我们可以设置setTitleEdgeInsets的left属性为正值(或者right属性为负值),让文字往右边移动

[redbBtn setTitleEdgeInsets:UIEdgeInsetsMake(0, 20, 0, 0)];
//或者
//[redbBtn setTitleEdgeInsets:UIEdgeInsetsMake(0, 0, 0, -20)];

也可以设置setImageEdgeInsets的right属性为正值(或者left属性为负值),让图片往左边移动

[redbBtn setImageEdgeInsets:UIEdgeInsetsMake(0, -20, 0, 0)];
//或者
//[redbBtn setImageEdgeInsets:UIEdgeInsetsMake(0, 0, 0, 20)];

当然20这个值不是随便设置的,要根据title和iamge的宽度(或者高度),以及Btn的高度或者宽度来协调.

读懂了以上的几个属性.

我们处理成四个样式

1.图片在左,文字在右;2.图片在右,文字在左;3.图片在上,文字在下;4.图片在下,文字在上;

代码如下:

- (void)setBtnImageAndTitle:(UIButton *)btn WithStyle:(NSString *)style Spacing:(CGFloat)spacing
{if ([style isEqualToString:@"top"]){CGFloat imageW = btn.imageView.frame.size.width;CGFloat imageH = btn.imageView.frame.size.height;CGFloat titleIntrinsicContentSizeW = btn.titleLabel.intrinsicContentSize.width;CGFloat titleIntrinsicContentSizeH = btn.titleLabel.intrinsicContentSize.height;btn.imageEdgeInsets = UIEdgeInsetsMake(- titleIntrinsicContentSizeH - spacing, 0, 0, - titleIntrinsicContentSizeW);btn.titleEdgeInsets = UIEdgeInsetsMake(0, - imageW, - imageH - spacing, 0);}else if ([style isEqualToString:@"left"]){if (btn.contentHorizontalAlignment == UIControlContentHorizontalAlignmentLeft) {btn.titleEdgeInsets = UIEdgeInsetsMake(0, spacing, 0, 0);} else if (btn.contentHorizontalAlignment == UIControlContentHorizontalAlignmentRight) {btn.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, spacing);} else {btn.imageEdgeInsets = UIEdgeInsetsMake(0, - 0.5 * spacing, 0, 0.5 * spacing);btn.titleEdgeInsets = UIEdgeInsetsMake(0, 0.5 * spacing, 0, - 0.5 * spacing);}}else if ([style isEqualToString:@"bottom"]){CGFloat imageW = btn.imageView.frame.size.width;CGFloat imageH = btn.imageView.frame.size.height;CGFloat titleIntrinsicContentSizeW = btn.titleLabel.intrinsicContentSize.width;CGFloat titleIntrinsicContentSizeH = btn.titleLabel.intrinsicContentSize.height;btn.imageEdgeInsets = UIEdgeInsetsMake(titleIntrinsicContentSizeH + spacing, 0, 0, - titleIntrinsicContentSizeW);btn.titleEdgeInsets = UIEdgeInsetsMake(0, - imageW, imageH + spacing, 0);}else{CGFloat imageW = btn.imageView.image.size.width;CGFloat titleW = btn.titleLabel.frame.size.width;if (btn.contentHorizontalAlignment == UIControlContentHorizontalAlignmentLeft) {btn.imageEdgeInsets = UIEdgeInsetsMake(0, titleW + spacing, 0, 0);btn.titleEdgeInsets = UIEdgeInsetsMake(0, - imageW, 0, 0);} else if (btn.contentHorizontalAlignment == UIControlContentHorizontalAlignmentRight) {btn.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, - titleW);btn.titleEdgeInsets = UIEdgeInsetsMake(0, 0, 0, imageW + spacing);} else {CGFloat imageOffset = titleW + 0.5 * spacing;CGFloat titleOffset = imageW + 0.5 * spacing;btn.imageEdgeInsets = UIEdgeInsetsMake(0, imageOffset, 0, - imageOffset);btn.titleEdgeInsets = UIEdgeInsetsMake(0, - titleOffset, 0, titleOffset);}}
}//调用代码[self setBtnImageAndTitle:redbBtn WithStyle:@"right" Spacing:10];

相关文章:

UIButton的UIEdgeInsetsMake属性(setTitleEdgeInsets,setImageEdgeInsets)

一.UIEdgeInsetsMake的四个属性 UIEdgeInsetsMake 有四个属性,依次是 Top,left,bottom,right [Btn setTitleEdgeInsets:UIEdgeInsetsMake( top, left, bottom, right)]; 四个属性的默认值为0,拿其中一个left属性来聊, 你可以理解为文字距离Btn左边界的“位移”是0, 如果…...

子网掩码是什么?

子网掩码(Subnet Mask)是用于划分网络的一个32位的二进制数,用于指示IP地址中哪些位用于网络标识,哪些位用于主机标识。 在IPv4网络中,IP地址由32位二进制数组成,通常表示为四个十进制数,每个数…...

SQLALchemy 数据的 CRUD 操作

SQLALchemy 数据的 CRUD 操作 导入必要的模块创建数据库引擎创建会话CRUD 操作创建(Create)读取(Read)更新(Update)删除(Delete)过滤条件使用 `filter` 方法使用 `filter_by` 方法总结聚合函数使用ORM接口使用SQL表达式语言注意关闭会话注意事项SQLAlchemy 是一个流行的…...

reactFiberLane

Lane (车道模型) 英文单词lane翻译成中文表示"车道, 航道"的意思, 所以很多文章都将Lanes模型称为车道模型 Lane模型的源码在ReactFiberLane.js, 源码中大量使用了位运算(有关位运算的讲解, 首先引入作者对Lane的解释(相应的 pr), 这里简单概括如下: Lane类型被定义…...

Hackademic.RTB1靶场实战【超详细】

靶机下载链接:https://download.vulnhub.com/hackademic/Hackademic.RTB1.zip 一、主机探测和端口扫描 nmap 192.168.121.0/24 ip:192.168.121.196 端口:22、80 二、访问80端口 发现target可点击 点击后跳转,页面提示目标是读取到 key.txt 文件 fin…...

让3岁小孩都能理解LeetCode每日一题_3148.矩阵中的最大得分

解释说明&#xff1a; 上面的内容的意思是为了有只移动一次的情况&#xff0c;而后面的grid&#xff08;i,j)-grid(i,k)由于j严格大于k,所以至少移动了一次&#xff0c;前面可以保持不移动&#xff0c;不移动就是选择0。 class Solution {public int maxScore(List<List&l…...

8.15日学习打卡---Spring Cloud Alibaba(三)

8.15日学习打卡 目录&#xff1a; 8.15日学习打卡为什么需要服务网关Higress是什么安装DockerCompose部署Higress创建网关微服务模块Higress路由配置Higress策略配置-跨域配置Higress解决如何允许跨域Higress策略配置之什么是HTTP认证Higress策略配置-Basic 认证什么是JWT认证J…...

2024下半年EI学术会议一览表

2024下半年将举办多个重要的EI学术会议&#xff0c;涵盖了从机器视觉、图像处理与影像技术到感知技术、绿色通信、计算机、大数据与人工智能等多个领域。 2024下半年EI学术会议一览表 第二届机器视觉、图像处理与影像技术国际会议&#xff08;MVIPIT 2024&#xff09;将于2024…...

【海奇HC-RTOS平台E100-问题点】

海奇HC-RTOS平台E100-问题点 ■ btn 没有添加到group中 &#xff0c;怎么实现的事件的■ 屏幕是1280*720, UI是1024*600,是否修改UI■ hc15xx-db-e100-v10-hcdemo.dtb 找不到■ 触摸屏驱动 能否给个实例■ 按键驱动■ __initcall(projector_auto_start)■ source insigt4.0 #if…...

性能测试之Mysql数据库调优

一、前言 性能调优前提&#xff1a;无监控不调优&#xff0c;对于mysql性能的监控前几天有文章提到过&#xff0c;有兴趣的朋友可以去看一下 二、Mysql性能指标及问题分析和定位 1、我们在监控图表中关注的性能指标大概有这么几个&#xff1a;CPU、内存、连接数、io读写时间…...

使用 RestHighLevelClient 进行 Elasticsearch 高亮查询及解析

在搜索引擎中&#xff0c;高亮显示查询关键字是一个提升用户体验的功能&#xff0c;它可以帮助用户更快地定位到相关信息。Elasticsearch 支持在搜索结果中对匹配的文本进行高亮显示。本文将介绍如何在 Java 应用程序中使用 Elasticsearch 的 RestHighLevelClient 执行高亮查询…...

Java基础入门15:算法、正则表达式、异常

算法&#xff08;选择排序、冒泡排序、二分查找&#xff09; 选择排序 每轮选择当前位置&#xff0c;开始找出后面的较小值与该位置交换。 选择排序的关键&#xff1a; 确定总共需要选择几轮&#xff1a;数组的长度-1。 控制每轮从以前位置为基准&#xff0c;与后面元素选择…...

SpringBoot响应式编程 WebFlux入门教程

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 &#x1f525; 微信&#xff1a;zsqtcyw 联系我领取学习资料 …...

LeetCode 383. 赎金信

题目 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1&#xff1a; 输入&…...

python绘制电路图

要在 Python 中实现电路图&#xff0c;你可以使用一些专门的库来创建和可视化电路图。一个常用的库是 schemdraw&#xff0c;它可以用来绘制电路图&#xff0c;并支持多种电气组件和符号。 下面是一个使用 schemdraw 库绘制简单电路图的示例&#xff1a; 安装 schemdraw 库&am…...

Vue3 Suspense 和 defineAsyncComponent 结合使用方法

Suspense&#xff1a;用于协调对组件树中嵌套的异步依赖的处理。 defineAsyncComponent&#xff1a;定义一个异步组件&#xff0c;它在运行时是懒加载的。参数可以是一个异步加载函数&#xff0c;或是对加载行为进行更具体定制的一个选项对象。 异步组件的好处&#xff1a;使…...

GitHub中Codespace怎么使用;LLM模拟初始化;MLP:全连接神经网络的并行执行

目录 PyUnit unittest是什么 unittest怎么使用 GitHub中Codespace怎么使用 测试常用功能 LLM模拟初始化 参数解释 类属性设置 总结 MLP:全连接神经网络的并行执行 假设 代码解释 注意事项 PyUnit unittest是什么 unittest是Python的内置单元测试框架,原名PyUn…...

【rh】rh项目部署

【fastadmin】 1、项目先clone到本地&#xff0c;其中web为h5前端使用(gitclone后&#xff0c;把web内容放进去再提交)&#xff0c;其余为项目后端使用 2、安装本地环境&#xff0c;项目跑起来&#xff0c;步骤如下&#xff1a; 1&#xff09;查春.git 和 composer,json 版本信…...

VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection

VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection Abstract 摘要部分&#xff0c;作者首先指出了3D点云中目标检测的重要性&#xff0c;在自动驾驶导航、家政机器人以及增强现实和虚拟现实等多个领域有重要的作用。然后&#xff0c;提到了现有方法的…...

结构开发笔记(三):solidworks软件(二):小试牛刀,绘制一个立方体

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/141122350 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...