UIButton内部文本和图片的布局是我们日常代码中,不可缺少的部分,按钮默认左边图片右边文本,那要实现左边文本,右边图片,我们该怎么解决呢,上面图片,下面文本又该怎么办呢

其实很简单,今天总结下,目前主要用两种方式,一种就是重写按钮,另一种就是通过setTitleEdgeInsets和setImageEdgeInsets方法解决

下图是按钮默认情况下的图文布局

左边文本,右边图片
首先介绍重写按钮吧,新建一个按钮继承UIButton,

- (void)layoutSubviews
{    [super layoutSubviews];     CGRect imageRect = self.imageView.frame;imageRect.size = CGSizeMake(30, 30);    imageRect.origin.x = (self.frame.size.width - 30) ;    imageRect.origin.y = (self.frame.size.height  - 30)/2.0f;          CGRect titleRect = self.titleLabel.frame;       titleRect.origin.x = (self.frame.size.width - imageRect.size.width- titleRect.size.width);       titleRect.origin.y = (self.frame.size.height - titleRect.size.height)/2.0f;       self.imageView.frame = imageRect;    self.titleLabel.frame = titleRect;}

效果如下:

上面图片,下面文本
同样用重写按钮的方法

- (void)layoutSubviews{[super layoutSubviews];    CGRect imageRect = self.imageView.frame;imageRect.size = CGSizeMake(30, 30);imageRect.origin.x = (self.frame.size.width - 30) * 0.5;imageRect.origin.y = self.frame.size.height * 0.5 - 40;    CGRect titleRect = self.titleLabel.frame;titleRect.origin.x = (self.frame.size.width - titleRect.size.width) * 0.5;titleRect.origin.y = self.frame.size.height * 0.5 ;    self.imageView.frame = imageRect;    self.titleLabel.frame = titleRect;
}

效果如下:
![屏幕快照 2016-05-30 10.23.11.png](//upload-images.jianshu.io/upload_images/616981-34430e2f6f66b344.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

另一种方法就是通过setTitleEdgeInsets和setImageEdgeInsets方法解决
这种方法的最大好处,就是不要在重写UIButton,直接在新建的UIButton中改变上面两个属性的值就可以达到我们想要的结果
左边文本右边图片
代码如下:

UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeCustom];btn1.frame = CGRectMake(50, 100, 80, 40);[btn1 setImage:[UIImage imageNamed:@"icon_shouye"] forState:UIControlStateNormal];[btn1 setTitle:@"首页" forState:UIControlStateNormal];[btn1 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];btn1.backgroundColor = [UIColor redColor];    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];btn.frame = CGRectMake(50, 50, 80, 40);[btn setImage:[UIImage imageNamed:@"icon_shouye"] forState:UIControlStateNormal];[btn setTitle:@"首页" forState:UIControlStateNormal];[btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];btn.backgroundColor = [UIColor redColor];    //上左下右btn.imageEdgeInsets = UIEdgeInsetsMake(0, btn.frame.size.width - btn.imageView.frame.origin.x - btn.imageView.frame.size.width, 0, 0);btn.titleEdgeInsets = UIEdgeInsetsMake(0, -(btn.frame.size.width - btn.imageView.frame.size.width ), 0, 0);[self.view addSubview:btn1];[self.view addSubview:btn];

完全颠倒的效果

上面图片下面文本
代码如下:

 UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];btn.frame = CGRectMake(50, 50, 80, 60);[btn setImage:[UIImage imageNamed:@"icon_shouye"] forState:UIControlStateNormal];[btn setTitle:@"首页的事" forState:UIControlStateNormal];[btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];btn.backgroundColor = [UIColor redColor];btn.imageEdgeInsets = UIEdgeInsetsMake(- (btn.frame.size.height - btn.titleLabel.frame.size.height- btn.titleLabel.frame.origin.y),(btn.frame.size.width -btn.titleLabel.frame.size.width)/2.0f -btn.imageView.frame.size.width, 0, 0);btn.titleEdgeInsets = UIEdgeInsetsMake(btn.frame.size.height-btn.imageView.frame.size.height-btn.imageView.frame.origin.y, -btn.imageView.frame.size.width, 0, 0);[self.view addSubview:btn];

效果图:

关于setTitleEdgeInsets和setImageEdgeInsets下面进行一些解释:
UIButton内有两个控件titleLabel和imageView,可以用来显示一个文本和图片,这里的图片区别于背景图片。给UIButton设置了title和image后,它们会图片在左边,文本在图片右边显示。它们两个做为一个整体依赖于button的contentHorizontalAlignment居左居右或居中显示。

显示格式区分:
1.当button.width < image.width时,只显示被压缩后的图片,图片是按照fillXY的方式压缩。
2.当button.width > image.width,且button.width < (image.width+text.width)时,图片正常显示,文本被压缩。
3.当button.width > (image.width+text.width)时,两者并列默认居中显示,可通过button的属性contentHorizontalAlignment改变对齐方式。

想改变两个子控件的显示位置,可以分别通过setTitleEdgeInsets和setImageEdgeInsets来实现。对titleLabel和imageView设置偏移是针对他当前的位置起作用的,并不是针对距离button边框的距离的。

typedefNS_ENUM(NSInteger, UIControlContentHorizontalAlignment) {
   UIControlContentHorizontalAlignmentCenter =0,//居中
   UIControlContentHorizontalAlignmentLeft   =1,//居左
   UIControlContentHorizontalAlignmentRight  =2,//居右
   UIControlContentHorizontalAlignmentFill   =3,//

想两改变两个子控件的显示位置,可以分别通过setTitleEdgeInsets和setImageEdgeInsets来实现。需要注意的是,对titleLabel和imageView设置偏移,是针对它当前的位置起作用的,并不是针对它距离button边框的距离的。感觉设置不设置UIControlContentHorizontalAlignmentCenter居中都没有影响,这个网上也找了些相关的信息,感觉都没有说到重点,我这里也没有完全理解透彻,之前都是在设置setTitleEdgeInsets和setImageEdgeInsets这些参数时都是不停的尝试得到的结果。目前这是我理解后,代码实现最后的答案,希望可以帮到大家。

文章转自 Migi000的简书

IOS-UIButton的文本与图片的布局相关推荐

  1. ios html富文本带图片,iOS 富文本文字添加图片

    如图:标题前面添加海外直邮和跨境保税,iOS最好使用富文本添加图片附件的方法 NSTextAttachment*textAttachment = [[NSTextAttachment alloc] i ...

  2. iOS UIButton 图片文字上下垂直布局 解决方案

    iOS UIButton 图片文字上下垂直布局 解决方案 参考文章: (1)iOS UIButton 图片文字上下垂直布局 解决方案 (2)https://www.cnblogs.com/yajunL ...

  3. iOS UIButton文字和图片间距随意调整

    代码地址如下: http://www.demodashi.com/demo/11606.html 前记 在开发中,我们经常会遇到这么一种情况,就是一个按钮上面有图片也有文字,但是往往设计并不是我们想要 ...

  4. iOS - UIButton 开发总结

    iOS - UIButton 开发总结 一 UIButton基础     iOS中提供了UIButton.UILable.UITextField.UIImageView等基础UI控件,继承于UIVie ...

  5. iOS UIButton根据内容自动布局

    级别: ★☆☆☆☆ 标签:「iOS」「UIButton」「自动布局」 作者: 沐灵洛 审校: QiShare团队 UIButton是开发过程中最常用的控件,可以设置各种样式,也可以自定义添加图片.标题 ...

  6. 如何让IOS中的文本实现3D效果

    本转载至 http://bbs.aliyun.com/read/181991.html?spm=5176.7114037.1996646101.25.p0So7c&pos=9     zhed ...

  7. IOS多选单选相册图片

    IOS多选单选相册图片 之前做项目让实现多选相册的图片,自己写了一个demo一直保存在电脑上,今天下午发现电脑128G的容量已经快没有了,准备清理电脑,所以把之前做的一些demo放在博客上,以后方便用 ...

  8. 文本居于图片左侧html,CSS实现图片与文本的居中对齐的常见方式

    1.为图片和文本都设置vertical-align:middle !DOCTYPE html> Page Title .d1>* { vertical-align: middle; } 这 ...

  9. ios xib 初始化高度_iOS图片伸缩技巧

    纵观移动市场,一款移动app,要想长期在移动市场立足,最起码要包含以下几个要素:实用的功能.极强的用户体验.华丽简洁的外观.华丽外观的背后,少不了美工的辛苦设计,但如果开发人员不懂得怎么合理展示这些设 ...

最新文章

  1. GAN网络立功!36分钟,建起5亿光年的宇宙区域
  2. 号召一下,看有多少人能响应!
  3. AWS — AWS 上的 NFV
  4. linux下批量修改文件名精彩解答案例分享
  5. android8 静音震动,iPhone8开启静音后手机振动怎么办?苹果8关闭静音模式震动的两种方法...
  6. 一文读懂 HMM 模型和 Viterbi 算法
  7. python生成验证码_python之验证码生成(gvcode与captcha)
  8. 计算机维修实训报告模板,[计算机维修实验报告模板.doc
  9. 自然语言处理——词性标注实战
  10. Dalsa线扫相机SDK下载和安装
  11. SQL-从数据类型 varchar 转换为 bigint 时出错的解决方案
  12. 「数据集」一文道尽人脸数据集
  13. matlab db5是什么小波,3、代码 - matlab小波分析步骤是什么
  14. 吐血推荐 | 5+1款源代码管理笔记本(全平台)
  15. MySQL必知必会——数据库基础知识和MySQL基本使用
  16. maximum.accumulate函数及ndarray和list比较
  17. js事件坐标大乱斗:screenX、clientX、pageX、offsetX
  18. 大数据工程师和数据分析师有什么区别
  19. 机器学习————神经网络
  20. OpenSSL 使用openssl工具搭建私有CA

热门文章

  1. java c 传递字符串数组_JNI传递字符串数组J-StringArray
  2. Ajax请求中async属性
  3. 2016考试计算机知识基础题库,2016年计算机二级公共基础知识基础练习题演练(6)...
  4. android焦点动画,Android编程中PopupWindow的用法分析【位置、动画、焦点】
  5. python3 redis长链接超时_Python3 连接Redis字符串和字节问题探究
  6. python怎么安装xlutils_Python3安装xlutils
  7. dds通信中间件_车内的中间件协议:是面向服务,还是以数据为中心,或是RESTful?...
  8. pycharm缩进对齐线_代码中的缩进线
  9. python 列表去重(数组)的几种方法_python 列表去重(数组)的几种方法(转)
  10. 2×3卡方检验prism_戏说卡方检验