首页 > 其他分享 >ios开发之--UIButton中imageView和titleLabel的位置调整

ios开发之--UIButton中imageView和titleLabel的位置调整

时间:2023-08-22 11:39:54浏览次数:32  
标签:-- ios bounds titleLabel width imageView btn size

在使用UIButton时,有时候需要调整按钮内部的imageView和titleLabel的位置和尺寸。在默认情况下,按钮内部的imageView和titleLabel的显示效果是图片在左文字在右,然后两者紧挨在一起构成组合居中显示。

如下图:

ios开发之--UIButton中imageView和titleLabel的位置调整_#define

我们可以使用setImageEdgeInsets:和setTitleEdgeInsets:方法来调整两者的位置。在使用这两个方法之前,我们首先要将imageView和titleLabel定位在UIButton的左上角位置,方便参照坐标调节位置。使用以下语句来定位(UIButton实例名为btn):

[btn setContentHorizontalAlignment: UIControlContentHorizontalAlignmentLeft];
[btn setContentVerticalAlignment: UIControlContentVerticalAlignmentTop];

1、正常情况:

使用上面的方法,不进行任何操作,此时显示情况和坐标情况如下:

ios开发之--UIButton中imageView和titleLabel的位置调整_处理方法_02

2,将imageview居中,将titlelabel左移至贴边:

使用下面方法来实现:

[btn setImageEdgeInsets: UIEdgeInsetsMake(0, (btn.bounds.size.width-btn.imageView.bounds.size.width)*0.5, 0, 0)];
    [btn setTitleEdgeInsets: UIEdgeInsetsMake(0, -btn.imageView.bounds.size.width, 0, 0)];

 

 

ios开发之--UIButton中imageView和titleLabel的位置调整_处理方法_03

3,是imageview和titlelabel都居中,使用下面的方法来实现这种情况:

[btn setImageEdgeInsets: UIEdgeInsetsMake(0, (btn.bounds.size.width-btn.imageView.bounds.size.width)*0.5, 0, 0)];
    [btn setTitleEdgeInsets: UIEdgeInsetsMake(btn.imageView.bounds.size.height, (btn.bounds.size.width-btn.titleLabel.bounds.size.width)*0.5-btn.imageView.bounds.size.width, 0, 0)];

ios开发之--UIButton中imageView和titleLabel的位置调整_实例名_04

4,这是如果imageview的尺寸被压缩,使用下面的语句来讲imageview压缩下:

#define kImageWidth 100.
    [btn setImageEdgeInsets: UIEdgeInsetsMake(0, (btn.bounds.size.width-kImageWidth)*0.5, btn.bounds.size.height-kImageWidth, (btn.bounds.size.width-kImageWidth)*0.5)];
    [btn setTitleEdgeInsets: UIEdgeInsetsMake(btn.imageView.bounds.size.height, (btn.bounds.size.width-btn.titleLabel.bounds.size.width)*0.5-btn.imageView.bounds.size.width, 0, 0)];

会出现以下情况:

ios开发之--UIButton中imageView和titleLabel的位置调整_实例名_05

这个时候,可以看出来titlabel不居中了,这说明在使用了setImageEdgeInsets:方法后,imageView的尺寸会被改变。

那么为何titleLabel在水平方向上还会偏移呢?原因是这样的,我们一直把titleLabel的初始x值和imageView的宽度等同看待了。而在这里imageView的宽度变小了,但是titleLabel的初始x值仍然是等于缩小前的imageView的宽度的,我们却使用一个缩小后的imageView的宽度来代替titleLabel的初始x值,于是导致了偏移的出现。

要处理这种情况,有两种方法:

5、处理方法1,先定义titleLabel再定义imageView:

    使用以下语句来实现这种情况:

#define kImageWidth 100.
    [btn setTitleEdgeInsets: UIEdgeInsetsMake(kImageWidth, (btn.bounds.size.width-btn.titleLabel.bounds.size.width)*0.5-btn.imageView.bounds.size.width, 0, 0)];
    [btn setImageEdgeInsets: UIEdgeInsetsMake(0, (btn.bounds.size.width-kImageWidth)*0.5, btn.bounds.size.height-kImageWidth, (btn.bounds.size.width-kImageWidth)*0.5)];

此时按钮的显示情况和坐标情况如下:

ios开发之--UIButton中imageView和titleLabel的位置调整_#define_06

由于titleLabel在imageView被压缩前就使用了它的宽度来定位,所以能准确定位,也不会被之后的imageView压缩所影响。

 

6、处理方法2,先将imageView形变前的宽度记录下来:

    使用以下语句来实现这种情况:

#define kImageWidth 100.
    CGFloat imageWidth = btn.imageView.bounds.size.width;
    [btn setImageEdgeInsets: UIEdgeInsetsMake(0, (btn.bounds.size.width-kImageWidth)*0.5, btn.bounds.size.height-kImageWidth, (btn.bounds.size.width-kImageWidth)*0.5)];
    [btn setTitleEdgeInsets: UIEdgeInsetsMake(btn.imageView.bounds.size.height, (btn.bounds.size.width-btn.titleLabel.bounds.size.width)*0.5-imageWidth, 0, 0)];

ios开发之--UIButton中imageView和titleLabel的位置调整_处理方法_07

7,另外,如果想将imageView放大,比如将imageView的宽度定为180,那么会有以下情况:

ios开发之--UIButton中imageView和titleLabel的位置调整_处理方法_08

可以发现,imageView的尺寸还是150x150,并没有没放大,反而imageView的居中受到了影响,产生偏移了。

 

8、经过上面的测试,可以得到以下结论:

(1)、在UIButton中,titleLabel的初始x值是imageView的宽度;

(2)、imageView可以被压缩;

(3)、当imageView被压缩后,imageView的宽度会变小,此时就不可以再用imageView的宽度来代替titleLabel的初始x值来调整位置了;

(4)、imageView不可以被放大。


作者:稻草人11223

标签:--,ios,bounds,titleLabel,width,imageView,btn,size
From: https://blog.51cto.com/u_13188203/7187439

相关文章

  • ios开发之 -- NSString指定字体高亮显示
    一个简单的小需求,就是在一个字符串里面,指定一部分字节高亮显示,代码如下:NSString*descStr=@"需要高亮显示的字符";NSString*nickStr=[NSStringstringWithFormat:@"%@%@",@"这里是高亮显示以外的字符",descStr];NSMutableAttributedString*attrStr=[[NSMutabl......
  • ios开发之--使用xib适配iPhone X
    最近在修改一个老项目,里面有很多xib文件,需要适配iPhoneX,但是又不想重写页面用代码适配,分享个小方法,也算是个笨办法吧,适配iPhoneX底部,iPhoneX底部有34px的操作区域,而其他机型的则是没有的,具体步骤如下:1、2、3、双击上图箭头所指,进入如下界面:  然后,就可以了!上面导航适配,目前我还......
  • knn 算法的实现原理是怎样的
    K最近邻(K-NearestNeighbors,简称KNN)算法是一种用于分类和回归的基本机器学习算法。其原理是基于样本之间的距离度量,通过找出离待预测样本最近的K个训练样本,利用这K个样本的标签信息进行分类或回归预测。主要思想就是物以类聚人以群分的思想,关键就是KNN中K近邻中K的确定,和距离的定义......
  • 期货核心竞争力在于解读供需背后的东西
    我们有理念有方法论。平衡表这个方法是2005年叶总他们摸出来的。原来你看平衡表是没感觉的,后来大家知道,平衡表我们要知道未来半年、未来一年商品的供需平衡情况。还要读懂这个平衡表,很多人是读不懂的,我们以前自己摸索的时候,其它基本不看,我们只是在会议室看这个东西。所有数据都是我......
  • 软件测试|Git环境安装与配置指南
    简介Git是一个分布式版本控制系统,广泛用于团队协作开发和个人项目管理。相比于CVS和Subversion等传统的代码管理工具,因为采取了分布式的版本库,因此不需要服务端软件支持,Git也成为了大家进行版本控制的首选。在本文中,我们将为介绍Git的安装和配置,以便大家可以开始使用Git来管理我们......
  • MySQL基本SQL语句4(DCL)
    前言DCL英文全称是DataControlLanguage(数据控制语言),用来管理数据库用户、控制数据库的访问权限。一、DCL用户管理1.查询用户select*frommysql.user; Host代表当前用户访问的主机,如果为localhost,仅代表只能够在当前本机访问,是不可以远程访问的。User代表的是访问该数......
  • 38岁啦:说点什么好呢?
    我是卢松松,点点上面的头像,欢迎关注我哦!1985年的8月21日,农历七月初六。正好今天也是2023年8月21日,农历七月初六。该说点什么好呢?1985年,我就出生在这里,箭头所指的方向就是我出生的地点:1987年跟随父亲来到河北遵化。1992年(大概)搬来到了北京怀柔,离开遵化前去了一趟北戴河。照片拍摄......
  • Kotlin 风格,应该这样写drawable
    前言通常我们在res/drawable下面自定义shape和selector来满足一些UI的设计,但是由于xml最终转换为drawable需要经过IO或反射创建,会有一些性能损耗,另外随着项目的增大和模块化等,很多通用的样式并不能快速复用,需要合理的项目资源管理规范才能实施。那么通过代码直接创建这些drawable,可......
  • Java 中锁定和解锁PPT内容形状
    本文为您提供了在Java中锁定PowerPointPPT形状的综合指南。因此,您可以保护PowerPoint演示文稿的内容。出于多种原因,锁定形状可能很有用,包括防止意外更改、保护品牌标识、保持布局完整性等。那么,让我们继续看看如何在Java演示文稿中锁定或解锁形状。  Aspose.Slides 是......
  • java Swing 有没有文件夹选择器?
    这两天做一个图形化软件需要选择文件并进行文件读取,因此需要使用到JAVASpring中的文件选择框。参考:https://blog.51cto.com/u_92655/6514099参考2:https://blog.csdn.net/shalimu/article/details/128145834如果要选择文件夹,则需要设置参数:......