iOS笔记之UIButton的UIEdgeInsetsMake使用详解

合成孔径雷达(SAR)的常见工作模式 随着星载SAR技术研究的深入发展,单一的条带模式已经无法满足当今时代的需求,因此许多新的工作模式相继被提出。这些新模式在分辨率和测绘宽度等方面都有所提高,接下来将简要介绍几种常用的工作模式。 阅读详情

1、UIEdgeInsetsMake介绍

首先简单介绍一下UIEdgeInsetsMake
引用:UIEdgeInsetsMake使用详解的图片和讲解,再加上自己的理解与实现

先看定义

typedef struct UIEdgeInsets { 
  CGFloat top, left, bottom, right; // specify amount to inset (positive) for each of the edges. values can be negative to 'outset'
} UIEdgeInsets;

UIEdgeInsets实际就是一个结构体UIEdgeInsetsMake(CGFloat top , CGFloat left , CGFloat bottom , CGFloat right ),要设置的就是四个边距,(warning:left以右为正方向,right以左为正方向,这个不一定对、不一定对、不一定对(说三遍),但是可以帮助理解下面进行偏移时+ -距离,top向下为正和bottom向上为正)。

先看一张图:
图UIEdgeInsets

图中,蓝色标识为可变区域, 绿色标识为不变区域。UIEdgeInsets结构体的属性top与bottom为一对,用来指定纵向可变区域(黑色虚线矩形),left与right为一对,用来指定横向可变区域(白色虚线矩形)。当UIButton/UIImageView的size大于UIImage的size时,会调整图片中可变区域大小以铺满整个控件,具体调整规则如下:
(1)控件宽度大于图片宽度,拉伸白色虚线矩形
(2)控件高度大于图片高度,拉伸黑色虚线矩形
(3)控件宽度小于图片宽度时,横向整体缩小(可变区与不变区比例不变)
(4)控件高度小于图片高度时,纵向整体缩小(可变区与不变区比例不变)
说明:这四句总结我不知道你们有没有理解,反正我是没有理解。


上面都是引用别人写的东西,也该说说自己的内容了。

UIEdgeInsetsMake(CGFloat top , CGFloat left , CGFloat bottom , CGFloat right )

UIEdgeInsetsMake是一个用来描述内容物在包裹容器里面的内边距的一个结构体描述,用UIButton来举例,button里面的Image是内容物,button是包裹容器,可以用UIEdgeInsetsMake结构体来描述Image在button里面的内边距。
拿图“UIEdgeInsets”来说就是设置UIEdgeInsetsMake以后,Image的位置就是黑色虚线和白色虚线重合的中间区域。
这种理解有一个前提就是用来描述单独内容物,比如在UIButton里面你只设置了Image或者只设置了TitleLabel的时候,当同时设置了Image和TitleLabel的时候,会有一些差别,下面再说。

2、UIEdgeInsetsMake在UIButton上的应用

回到主题《UIButton的UIEdgeInsetsMake的使用》
这里主要是讲UIEdgeInsetsMake在UIButton上的应用,相信很多人都遇到了那种需求,就是原本button图片在左,title在右,很多时候确实也是这样,但是有时候需求可能是“图片在上,title在下”或者是“图片在右,title在左”,如下图所示:

原始按钮

修改后的按钮

这时候原来系统自带按钮就需要我们使用UIEdgeInsetsMake来进行设置了。上面说到内容物是单一的和多个的是不一样,不一样在哪?

对于设置了image和title的button,系统会在设置以后自动设置一个合适的ImageEdgeInsets和TitleEdgeInsets

问:啥叫合适的?
答:你new一个button显示一下就会发现,他边距确实蛮合适的,虽然有时候title挤在一起显示不全,但是起码边距看上去蛮顺眼,所以我也不知道啥叫合适的,我只知道new一个button,设置了image和title以后,就会有一个默认的ImageEdgeInsets和TitleEdgeInsets。

下面我们在设置image和title之后,打印一下两者的边距:

//生成button
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setTitle:@"这是一个按钮" forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"image"] forState:UIControlStateNormal];
button.frame = CGRectMake(100, 100, 160, 40);
button.backgroundColor = [UIColor redColor];
button.titleLabel.backgroundColor = [UIColor purpleColor];
[self.view addSubview:button];

//打印before
NSLog(@"before-->%@",NSStringFromUIEdgeInsets(button.imageEdgeInsets));
NSLog(@"before-->%@",NSStringFromUIEdgeInsets(button.titleEdgeInsets));

//修改边距
button.imageEdgeInsets = UIEdgeInsetsMake(0, button.titleLabel.intrinsicContentSize.width, 0, -button.titleLabel.intrinsicContentSize.width);
button.titleEdgeInsets = UIEdgeInsetsMake(0, -button.currentImage.size.width, 0, button.currentImage.size.width);

//打印after
NSLog(@"after-->%@",NSStringFromUIEdgeInsets(button.imageEdgeInsets));
NSLog(@"after-->%@",NSStringFromUIEdgeInsets(button.titleEdgeInsets));

会发现两者的边距,会发现两者打印出来都是(0,0,0,0)和(0,0,0,0)。

打印结果

WTF???你是来逗我的,这边距明显都不为0啊,所以我猜想,这个其实并不是image和titleLabel相对于button的边距,这是在原有基础边距基础上进行的一个偏移。

上面我们说到,在给button设置了image和title以后,系统会自动设置一个合适(多合适,看原始按钮那个图就知道,确实蛮合适的这边距)的ImageEdgeInsets和TitleEdgeInsets,所以我们此时打印before其实可能打印的并不是真实的imageEdgeInsets和titleEdgeInsets,而是我们设置的EdgeInsets,因为我们没有设置,所以都打印(0,0,0,0),后来我们设置以后,打印出了{0, 110.5, 0, -110.5}和{0, -23, 0, 23}。
现在就要说说设置的这两行代码:

button.imageEdgeInsets = UIEdgeInsetsMake(0, button.titleLabel.intrinsicContentSize.width, 0, -button.titleLabel.intrinsicContentSize.width);
button.titleEdgeInsets = UIEdgeInsetsMake(0, -button.currentImage.size.width, 0, button.currentImage.size.width);

一个更新image的边距,一个更新title的边距。
首先我们说更新image的边距,我们需要让image右移一个titleLabel的宽度的距离,所以我们需要image的左右边距都右移一个titleLabel。
还记得我们一开始设定的正负方向吗,(warning:left以右为正方向,right以左为正方向,但是可以帮助理解下面进行偏移时+ -距离,top向下为正和bottom向上为正,这个可以参照使用masonry进行约束设置判定方向)。

我们使用button.titleLabel.intrinsicContentSize.width计算titleLabel的宽度(tips:使用button.titleLabel.bounds.size.width的在iOS8以上会得到宽度为0的结果,造成错误的结果),然后因为image的left和right都要向右偏移一个titleLabel的宽度,而left以右为正方向,right以左为正方向,所以是设置的是UIEdgeInsetsMake(0, button.titleLabel.intrinsicContentSize.width, 0, -button.titleLabel.intrinsicContentSize.width);
同理,titleLabel需要向左移一个image的宽度,按照我们预想的正负方向进行设置:button.titleEdgeInsets = UIEdgeInsetsMake(0, -button.currentImage.size.width, 0, button.currentImage.size.width);
这里需要注意使用button.currentImage.size.width计算得到的效果要好于button.imageView计算出来的width


总结模式:
- 图片在左,title在右
- 图片在上,title在下
- 图片在右,title在左
- 图片在下,title在上

贴出代码,就不一一讲解了:

- (void)layoutButtonWithEdgeInsetsStyle:(MKButtonEdgeInsetsStyle)style
                        imageTitleSpace:(CGFloat)space {
    // 1. 得到imageView和titleLabel的宽、高
    //    CGFloat imageWith = self.imageView.frame.size.width;
    //    CGFloat imageHeight = self.imageView.frame.size.height;
    CGFloat imageWith = self.currentImage.size.width;
    CGFloat imageHeight = self.currentImage.size.height;

    CGFloat labelWidth = 0.0;
    CGFloat labelHeight = 0.0;
    if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
        // 由于iOS8中titleLabel的size为0,用下面的这种设置
        labelWidth = self.titleLabel.intrinsicContentSize.width;
        labelHeight = self.titleLabel.intrinsicContentSize.height;
    } else {
        labelWidth = self.titleLabel.frame.size.width;
        labelHeight = self.titleLabel.frame.size.height;
    }

    // 2. 声明全局的imageEdgeInsets和labelEdgeInsets
    UIEdgeInsets imageEdgeInsets = UIEdgeInsetsZero;
    UIEdgeInsets labelEdgeInsets = UIEdgeInsetsZero;

    // 3. 根据style和space得到imageEdgeInsets和labelEdgeInsets的值
    switch (style) {
        case MKButtonEdgeInsetsStyleTop: {
            imageEdgeInsets = UIEdgeInsetsMake(-labelHeight-space, 0, 0, -labelWidth);
            labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith, -imageHeight-space, 0);
        }
            break;
        case MKButtonEdgeInsetsStyleLeft: {
            imageEdgeInsets = UIEdgeInsetsMake(0, -space, 0, space);
            labelEdgeInsets = UIEdgeInsetsMake(0, space, 0, -space);
        }
            break;
        case MKButtonEdgeInsetsStyleBottom: {
            imageEdgeInsets = UIEdgeInsetsMake(0, 0, -labelHeight-space, -labelWidth);
            labelEdgeInsets = UIEdgeInsetsMake(-imageHeight-space, -imageWith, 0, 0);
        }
            break;
        case MKButtonEdgeInsetsStyleRight: {
            imageEdgeInsets = UIEdgeInsetsMake(0, labelWidth+space, 0, -labelWidth-space);
            labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith-space, 0, imageWith+space);
        }
            break;
        default:
            break;
    }
    // 4. 赋值
    self.titleEdgeInsets = labelEdgeInsets;
    self.imageEdgeInsets = imageEdgeInsets;
}
多层环境室内定位系统综述总结 本文是一篇发表于2025年《IEEE Access》期刊的综述论文,由埃及开罗美国大学与卡塔尔卡内基梅隆大学团队合作完成,聚焦多层环境室内定位系统的核心挑战、技术方案及未来方向,填补了该领域缺乏全面综述的空白。 阅读详情

相关推荐

科研ABC - The Results Section(SCI论文写作补充)

1 前言 1.1 IMRD格式 1.2 Results部分意义 1.3 Results部分主要内容 2 Results & Discussion关系 2.1 Results & Discussion部分的搭配方式 2.2 Results & Discussion部分的区分 3 Results部分的结构 3.1 Move 1: Set the Stage 3.1....

洋洋洋2020的blog 1616

UIEdgeInsetsMake学习

参考链接 参考链接 在平常我们使用button的时候,需求可能是需要我们满足button的Image和Label的各种体位,这个使用我们就需要使用UIEdgeInsetsMake来满足下需求,通过设置button的image和label的insetEdge来满足。 UIEdgeInsetsMake 介绍 typedef struct UIEdgeInsets { CGFloat top, left, bottom, right; // specify amount to inset (positive

github_38399864的博客 612

华南理工大学电子与信息学院23年预推免复试面试经验贴

华南理工大学电子与信息学院23年预推免复试面试经验贴

Scut_Ty的博客 3296

UIButton的UIEdgeInsetsMake属性(setTitleEdgeInsets,setImageEdgeInsets)

UIButton的UIEdgeInsetsMake属性(setTitleEdgeInsets,setImageEdgeInsets)

wyz670083956的博客 1216

Minecraft Forge模组开发入门:从环境搭建到事件监听实战

事件驱动编程是一种基于事件和事件监听器的软件架构模式,其核心原理是通过事件总线实现组件间的松耦合通信。在游戏开发领域,这种模式能够有效处理玩家交互、状态变更等异步操作,具有高度的灵活性和可扩展性。Java作为面向对象编程语言,通过注解和反射机制为事件驱动提供了天然支持。Minecraft模组开发正是事件驱动编程的典型应用场景,开发者可以利用Forge框架提供的事件总线监听游戏内各种行为。本文以Minecraft Forge模组开发为例,详细讲解如何通过Gradle构建工具搭建开发环境,并实现自定义方块注册和

culi3182的博客 395

【STM32】从零构建串口IAP框架:BootLoader与App双向跳转实战解析

本文详细解析了STM32串口IAP框架的构建,重点阐述了BootLoader与App双向跳转的实战原理与实现步骤。内容涵盖Flash分区规划、中断向量表重定向、通信协议设计及固件升级流程,并针对跳转失败、程序跑飞等常见问题提供了解决方案,帮助开发者掌握产品级远程升级的核心技术。

wind6的博客 838

iOS笔记之使用UIEdgeInsetsMake调整UIButton图片和标题位置

1、UIEdgeInsetsMake介绍 首先简单介绍一下UIEdgeInsetsMake 引用:UIEdgeInsetsMake使用详解的图片和讲解,再加上自己的理解与实现 先看定义 typedef struct UIEdgeInsets { CGFloat top, left, bottom, right; // specify amount to inset (positive) fo...

weixin_34101229的博客 456

Python之美——Python2与Python3多版本共存

Python多版本共存的方法Python2、Python3共存的方法python2下载及环境变量配置第一步、打开Python官网,下载Python2第二步、python2环境变量配置测试结果 Python2、Python3共存的方法 方法如下: 1.先确保不同版本解释器的python.exe所在的路径在环境变量中 2.拷贝各自的python.exe并重命名即可 步骤(理解不了下面有图示): 1、首先你需要将不同的python版本安装,且都已经将跟版本的环境变量配置好了,python3和2的下载方式

chenchen5152的博客 3945

UIEdgeInsetsMake使用详解

UIEdgeInsetsMake使用详解

ryyzxf的博客 564

Xilinx DMA IP核心配置与实战解析

本文介绍了Xilinx DMA IP核在直接寄存器模式下的配置与工作流程。DMA通过AXI4-Lite接口接收指令,实现内存与数据流之间的高速传输,无需CPU介入。文章详细说明了开发环境配置、IP参数设置(包括地址位宽、数据宽度等关键参数)以及寄存器操作流程。通过仿真分析,展示了读操作中AXI4接口的突发传输机制,包括地址、长度和突发大小的配置。文中还提供了寄存器地址映射表、信号定义等关键信息,为DMA IP核的应用开发提供了实用参考。

weixin_37688766的博客 884

【漏洞复现】爱数云盘 Usrm_GetAllUsers 未授权访问漏洞

爱数 AnyShare存在未授权漏洞,未授权的攻击者可以通过该漏洞获取用户名信息。

qq_67810151的博客 3120

UIEdgeInsetsMake的作用

UIEdgeInsets UIEdgeInsetsMake (    CGFloat top,    CGFloat left,    CGFloat bottom,    CGFloat right ); 为button或者view创建边缘, top left bottom right分别表示各边缘的宽度,可为负值。 它的经典作用就是在一个在scrollview被拖曳时根据 c

backapace的专栏 1658

图解电动汽车:电动汽车的分类

前面《电动汽车简介》中简单介绍了电动汽车的分类,主要包括混合动力电动汽车(HEV)和纯电动汽车(BEV)两大类。其中,混合动力汽车又可分为非插电式混合动力汽车、插电式混合动力汽车(PHEV)以及增程式电动汽车(REEV)。 主要分类 简单来说,各类电动汽车的特点如下。 纯电动汽车(BEV)就是指动力来源完全由电能提供,由电动机驱动的汽车,并且电能储存在电池中。 混合动力汽车(HEV)则是指动力来源可以是化石燃料,也可以是电能,并且电能除了可以存储在电池中,还可以由化石能源转化而来。 非插电式混合动力汽车

程序员「阿基米东」的编程之旅 3088

iOS:如何通过UIEdgeInsetsMake来制作可伸缩的Button

注:本文翻译自国外iOS开发者

xiaoyulong007的专栏 5003

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

UIButton通过UIEdgeInsetsMake设置image和title的位置

使用 UIEdgeInsetsMake时

ye405464136的专栏 1971

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

iOS-如何通过UIEdgeInsetsMake来制作可伸缩的Button

注:本文翻译自国外iOS开发者Natasha The Robot的一篇博文,链接在此。 在iOS应用中,经常会有很多Button有相同的背景图片,却由于处在不同的位置而大小不同(尽管在iOS7中Button已经没有背景图片了)。比如,一个功能为“Save”的Button要比功能为“Submit”要窄一些,但是他们都可以拥有紫色背景。 在这篇文章中,你不需要为每个button准备不同的背景图片。

梦从这里启航,代码改变世界 594

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

UIButton中UIEdgeInsetsMake的用法

#pragma mark UIEdgeInsetsMake //    UIEdgeInsetsMake //    里面的四个参数表示距离上边界、左边界、下边界、右边界的距离,默认都为零,title/image在button的正中央 //    UIEdgeInsetsMake(上,左,下,右)     //Button的imgview离右边文字距离30     /

u012222212的专栏 728

IOS设置UIButton的Image大小

首先这里说的是UIButton的Image,不是backgroundImage。之所以说到这个问题,是因为我有一个button是 75*25的,切的一张图片是25*25的,我想让图片不被拉伸显示,或者不重复显示,且能显示在button的中间。 尝试了几种无效的方法包括: 1、直接操作button的ImageView 2、把image设置成stretch Image 3、对I

IT_ZGC的博客 2万+

UIButton使用UIEdgeInsetsMake 图片 标题 位置 排版

原文地址:http://blog.youkuaiyun.com/yanxiaoqing/article/details/7230660 默认情况下,不设置的效果,都使居中现实,button为150*150 使用以下设置后:   [self setTitleEdgeInsets:UIEdgeInsetsMake( 0.0,-backGroundImag.size.width, 

woshiwls的专栏 1653

ios 图片居中裁剪_iOS - UIButton(UIEdgeInsets)/设置button上的文字和图片上下垂直居中对齐...

UIEdgeInsetstypedef struct UIEdgeInsets {CGFloat top, left, bottom, right; // specify amount to inset (positive) for each of the edges. values can be negative to 'outset'} UIEdgeInsets;在UIButton中有三个对...

weixin_35148673的博客 232

iOS修改UIButton setTitle字体颜色和调整字体位置

调整Title字体位置 [button setTitleEdgeInsets:UIEdgeInsetsMake(10, 0, 0, 0)]; 四个参数分别代表:上边界,左边界,下边界,右边界 修改UIButton setTitle字体颜色 [button addTarget:self action:@selector(clickAction) for

恐高的菜鸟 2966

OC/Swift 知识 UIButton

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。 属性 属性 注释 frame 约束 showsTouchWhenHighlighted 点击数是闪光效果会被前景图片盖住中间部分 titleLabel.font 设置文字大小 enabled 隐藏按键 titleLabel.shadowOffset

weixin_38716347的博客 442

UIButton上使用UIEdgeInsetsMake title跟图片对齐

默认情况下,不设置的效果,都使居中现实,button为150*150 使用以下设置后:   [self setTitleEdgeInsets:UIEdgeInsetsMake( 0.0,-backGroundImag.size.width, 0.0,0.0)];   [self setImageEdgeInsets:UIEdgeInsetsMake(0.0, 0.

Leeyehong_self的专栏 1404

UIEdgeInsetsMake详细讲解

转载:http://natashatherobot.com/ios-stretchable-button-uiedgeinsetsmake/ iOS: How To Make A Stretchable Button With UIEdgeInsetsMake Posted on October 24th, 2013 In a given iOS app, there a

Bob-IOS开发 3349

UIButton上使用UIEdgeInsetsMake使得title跟图片对齐

默认情况下,不设置的效果,都是居中现实,button为150*150 使用以下设置后:   [self setTitleEdgeInsets:UIEdgeInsetsMake( 0.0,-button.imageView.size.width, 0.0,0.0)];   [self setImageEdgeInsets:UIEdgeInsetsMake(0.0

lf20105103039的专栏 422
上一篇: iOS实战之调起QQ加群页和临时会话页
下一篇: iOS实战之从左往右自动填充布局页面
SuAdrenine
博客等级 码龄11年 6粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值