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. 揭开枚举类的面纱(Unlocking the Enumeration/enum Mystery)

    枚举给用户定义固定数据组提供了方便.枚举类就是一系列常量整型值,这也就意味着枚举类型不能被修改. 这里我们将要讨论C语言中枚举类型的用法和限制. 枚举通过枚举关键值定义,类似结构体定义 语法(Synt ...

  2. Java集合的实现细节—Set集合和Map集合

    Set:代表无序.不可重复的集合 Map:代表key-value对集合,也称为关联数组 从表面上看,Set和Map相似性很少,但实际上可以说Map集合时Set集合的扩展. 1.Set集合和Map集合的 ...

  3. vue + vue-resource 跨域访问

    使用vue + vue-resource进行数据提交,后台使用RESTful API的方式存取数据,搞了一天,终于把后台搞好了.进行联合调试时,数据不能提交,报403错误: XMLHttpReques ...

  4. sql加强练习

    1.用一条SQL语句 查询出每门课都大于80分的学生姓名 name kecheng fenshu 张三 语文 81张三 数学 75李四 语文 76李四 数学 90王五 语文 81王五 数学 100王五 ...

  5. UITableView的简单总结与回顾

    今天突发奇想的想对UItableView做一下汇总,感觉在编程中这个控件可以千变万化也是用的最多的一个了,下面就为大家简单总结下这个控件,也许还有不足,不过还是请各位不吝赐教了哈,那么我就开始了,我会 ...

  6. javascript什么是函数

    函数是完成某个特定功能的一组词语.如没有函数,完成任务可能需要五行.十行.甚至更多的代码. 这是未满就可以把完成特定功能的代码块放到一个函数里,直接调用这个函数,就省重复输入大量代码的麻烦. 如何定义 ...

  7. DataTable复制自身行

    在我们工作的过程中有可能要使用DataTable产生一些重复数据(在不重复读取数据库的情况下) 无废话,直接上代码 DataTable复制自身一行(目的产生重复数据),已测试通过可直接复制 /// & ...

  8. AngularJs练习Demo7

    @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...

  9. web-打印

    项目前景 由于之前的打印是客户端程序,也就是winform做的,现在需要改版成网页版,其他功能都能够很好的实现,就是在打印上遇到一些难点.由于第一次做打印功能,刚开始照搬winform中调用word文 ...

  10. js实现楼层效果

    今天自己写个楼层效果,有一点烦躁,小地方犯错误.各位大神来修改不足啊!!! <!DOCTYPE html><html lang="en"><head& ...