UIButton的contentEdgeInsets属性的深入研究

  • 由于用UIButton这个属性做过一些东西,但是对它的规律始终不太了解,虽然苹果官方文档的解释大体上可以理解为,这个属性设置的是内边距,更通俗点说,是规定,Button向内的多少区域其它控件是不能进入的。但是总存在一些奇怪的现象,所以我做了个Demo得出下面的规律。先看demo。可以下载自己尝试。

  • 我们先研究竖直方向上的,也就是顶部和底部向内推这个方向。代码如下,我们先在StoryBoard上创建一个Button然后, 设置Button上的文字,并让这个label自动换行,可以发现一开始Label的frame = {{3, 15}, {38, 41}}.然后我们打开竖直方向上的注释, 会发现下面比上面多推了10个单位, 而且这时候20.5 + 30.5 + 41大于Button的高度71的,那么你估计出Label的Y值了么,我尝试了很多出数据,得出了规律,此时Label是向上移动5给单位。也就是所处位置是{3, 10}.也就说,Label在竖直方向上的位置,取决于上下内边距之差的绝对值乘以0.5。至于是原来y值加上还是减去, 这要看偏向父空那一边,如果是底部往上推更多,那就是减去。

  • 再来研究水平方向,我以为水平方向也如此。但是并非如此,水平方向是不会相互作用的,如果水平两个方向的推进会将原来的Label进行压缩,但是Label的面积不会变,也就是说给Label留下的宽度如果小于Label的宽度,那么Label就会被压成这个宽度,然后会变长,所以当我们水平方向上压缩到0时候,Label就会不见了,因为此时Label相当于无限的长,无限的细致。就算水平某一方推进的已经覆盖掉了另外一方,Label还是会不存在。因为此时宽度是无限趋向于0

- (void)viewDidLoad {
[super viewDidLoad]; NSLog(@"before setting insets%@", NSStringFromCGRect(self.button.frame));
//self.button.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 71, 10); [self.button setTitle:@"testestes" forState:UIControlStateNormal];
self.button.titleLabel.numberOfLines = 0;
self.button.titleLabel.backgroundColor = [UIColor blueColor]; self.button.frame = CGRectMake(198, 285, 44, 71);
self.button.backgroundColor = [UIColor redColor]; [self.button layoutIfNeeded];
NSLog(@"after setting titleLabel's frame = %@", NSStringFromCGRect(self.button.titleLabel.frame)); //self.button.contentEdgeInsets = UIEdgeInsetsMake(0, 22, 0,21); // 研究水平方向测试1
//self.button.contentEdgeInsets = UIEdgeInsetsMake(0, 21, 0,21); // 研究水平方向测试2
//self.button.contentEdgeInsets = UIEdgeInsetsMake(0, 20, 0,21); // 研究水平方向测试3
// self.button.contentEdgeInsets = UIEdgeInsetsMake(20.5, 0, 30.5,0); // 研究竖直方向测试2
[self.button layoutIfNeeded]; NSLog(@"after setting insets titleLabel's frame = %@", NSStringFromCGRect(self.button.titleLabel.frame)); NSLog(@"after setting insets%@", NSStringFromCGRect(self.button.frame));
// Do any additional setup after loading the view, typically from a nib. */
}
  • 总结(两点):
  • UIButton设置内边距的时候,内边距 + 宽 <= UIButton的宽或者内边距 + 高<= UIButton。那么是没有问题的。Label的位置是不会变化的。
  • 当UIButton的宽高不满足上面的情况时候
    • 竖直方向UILabel是硬的,水平方向是软的。
    • 竖直方向移动多少, 取决于上下内边距之差的绝对值。
    • 水平方向的UILabel的宽度取决于所留空间是否够大于UILabel的宽。如果是,UILabel宽不会变, 如果不是的话,UILabel的宽就等于所留的宽, 高度于文字大小有关,如果宽度为挤压宽度且不为零(挤压宽度的意思是, 不是原来的宽, 是被挤压过的宽),那么X的坐标就是左边推进的高度。

关于UIButton中的ContentEdgeInsets的深入研究的更多相关文章

  1. UIButton中的**EdgeInsets是做什么用的?

    UIButton中的**EdgeInsets是做什么用的? UIEdgeInsetsMake Creates an edge inset for a button or view.An inset i ...

  2. UIButton中的三个UIEdgeInsets属性

    接着昨天的 UIButton中的三个UIEdgeInsets属性 ,今天我们具体谈谈UIButton的contentEdgeInsets.titleEdgeInsets.imageEdgeInsets ...

  3. 格而知之1:UIButton中imageView和titleLabel的位置调整

    在使用UIButton时,有时候需要调整按钮内部的imageView和titleLabel的位置和尺寸.在默认情况下,按钮内部的imageView和titleLabel的显示效果是图片在左文字在右,然 ...

  4. JScript中的prototype(原型)属性研究

    今天看到同事使用js中的Prototype,感觉很是新鲜.由此想深入学习一下prototype(英['prəʊtətaɪp] 美['protə'taɪp]n. 原型:标准,模范),在学习prototy ...

  5. 前后端分离Web项目中,RBAC实现的研究

    在前后端分离Web项目中,RBAC实现的研究   最近手头公司的网站项目终于渐渐走出混沌,走上正轨,任务也轻松了一些,终于有时间整理和总结一下之前做的东西. 以往的项目一般使用模板引擎(如ejs)渲染 ...

  6. SQLSERVER中的LOB页面简单研究

    SQLSERVER中的LOB页面简单研究 这篇文章和我另一篇文章是相辅相成的,在看<SQLSERVER2012 列存储索引的简单研究和测试>这篇文章之前希望大家先看一下这篇文章o(∩_∩) ...

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

    在使用UIButton时,有时候需要调整按钮内部的imageView和titleLabel的位置和尺寸.在默认情况下,按钮内部的imageView和titleLabel的显示效果是图片在左文字在右,然 ...

  8. 设置UIButton中的文字和图片,设置UILabel的文在显示不同颜色

    UIButton: UIEdgeInsets 在UIButton中有三个对EdgeInsets的设置:ContentEdgeInsets.titleEdgeInsets.imageEdgeInsets ...

  9. 关于C#中readonly的一点小研究

    可能园子里有不少文章已经说明了这个问题了,但是我在这里写这篇博客只是写写自己的一些体会,也权当是整理归纳,高手莫见笑. ===============正文分割线================== 现 ...

随机推荐

  1. [深入JUnit] 为什么别测试private函数

    [深入JUnit] 为什么别测试private函数 摘自http://www.tuicool.com/articles/iumaayJ 时间 2016-03-28 10:58:03 SegmentFa ...

  2. OpenXML - 如何导出List<DataModel>到Excel -- Part 1

    最近这几天研究OpenXML: 这是Open XML的一些介绍: Open XML 介绍:http://baike.baidu.com/view/1201978.htm 下载:http://www.m ...

  3. [转]notifyDataSetChanged() 动态更新ListView

    有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView.今 ...

  4. Django之CSRF 跨站请求伪造

    一.简介 1.点我了解什么是跨站请求伪造 2.django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对 ...

  5. Network 20Q--Q2 How does Google sell ad spaces?

    在使用Google搜索的时候会发现,搜索出来的页面除了在左边显示搜索结果以外,还会页面的右边推荐一些广告.那么Google是怎么从这些广告挣钱以及广告商可以通过Google广告获得什么利益呢? Goo ...

  6. css3 content画出各种图形

    原链接:http://www.phpjz.cn/web/201311/1700.html 之前看到一些网站用户content这个词,觉得很奇怪,原来是css3新增的一个样式,发现还挺好用的,特别是用移 ...

  7. Winform改变Textbox边框颜色(转)

    namespace MyTextBoxOne { //使用时必须把文本框的BorderStyle为FixedSingle才能使用 //一些控件(如TextBox.Button等)是由系统进程绘制,重载 ...

  8. (转)IIS7 下部署Asp.net应用

    最近在部署一个ASP.NET的应用到IIS7中的时候,遇到了一些问题,现在把部署中的遇到的问题和部署步骤进行总结一下,本文中只涉及到ASP.NET的基本部署. 一.    部署环境 Windows 7 ...

  9. Android ----------获取各种路径(更新中。。。。。。)

    ##在手机中的路径 *获取应用的路径,形式:/data/data/包名 String appDataDir = getApplicationInfo().dataDir; *获取手机数据存储路径,即/ ...

  10. Winform 无边框随意拖动【转载】

    本篇技术内容转载自:http://www.cnblogs.com/ap0606122/archive/2012/10/23/2734964.html using System; using Syste ...