关于UIButton中的ContentEdgeInsets的深入研究
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的深入研究的更多相关文章
- UIButton中的**EdgeInsets是做什么用的?
UIButton中的**EdgeInsets是做什么用的? UIEdgeInsetsMake Creates an edge inset for a button or view.An inset i ...
- UIButton中的三个UIEdgeInsets属性
接着昨天的 UIButton中的三个UIEdgeInsets属性 ,今天我们具体谈谈UIButton的contentEdgeInsets.titleEdgeInsets.imageEdgeInsets ...
- 格而知之1:UIButton中imageView和titleLabel的位置调整
在使用UIButton时,有时候需要调整按钮内部的imageView和titleLabel的位置和尺寸.在默认情况下,按钮内部的imageView和titleLabel的显示效果是图片在左文字在右,然 ...
- JScript中的prototype(原型)属性研究
今天看到同事使用js中的Prototype,感觉很是新鲜.由此想深入学习一下prototype(英['prəʊtətaɪp] 美['protə'taɪp]n. 原型:标准,模范),在学习prototy ...
- 前后端分离Web项目中,RBAC实现的研究
在前后端分离Web项目中,RBAC实现的研究 最近手头公司的网站项目终于渐渐走出混沌,走上正轨,任务也轻松了一些,终于有时间整理和总结一下之前做的东西. 以往的项目一般使用模板引擎(如ejs)渲染 ...
- SQLSERVER中的LOB页面简单研究
SQLSERVER中的LOB页面简单研究 这篇文章和我另一篇文章是相辅相成的,在看<SQLSERVER2012 列存储索引的简单研究和测试>这篇文章之前希望大家先看一下这篇文章o(∩_∩) ...
- ios开发之--UIButton中imageView和titleLabel的位置调整
在使用UIButton时,有时候需要调整按钮内部的imageView和titleLabel的位置和尺寸.在默认情况下,按钮内部的imageView和titleLabel的显示效果是图片在左文字在右,然 ...
- 设置UIButton中的文字和图片,设置UILabel的文在显示不同颜色
UIButton: UIEdgeInsets 在UIButton中有三个对EdgeInsets的设置:ContentEdgeInsets.titleEdgeInsets.imageEdgeInsets ...
- 关于C#中readonly的一点小研究
可能园子里有不少文章已经说明了这个问题了,但是我在这里写这篇博客只是写写自己的一些体会,也权当是整理归纳,高手莫见笑. ===============正文分割线================== 现 ...
随机推荐
- 【译】typeof null的前世今生
更新时间2013-11-05:为了更好的解释为什么typeof null的结果是object,我看了一下C代码的实现(译者注:Javascript源码). 在Javascript语 ...
- WPF - 使用Microsoft.Win32.OpenFileDialog打开文件,使用Microsoft.Win32.SaveFileDialog将文件另存
1. WPF 使用这个方法打开文件,很方便,而且可以记住上次打开的路径. Microsoft.Win32.OpenFileDialog openFileDialog = new Microsoft.W ...
- iphone开发之适配iphone5
iphone5出来了,从不用适配的我们也要像android一样适配不同分辨率的屏幕了. 公司产品新版本需要适配iphone5,经过一番折腾算是搞定了.下面分享给大家: iphone5的屏幕分辨 ...
- Android ActionBar详解(一):ActionBar概述及其创建
在Android 3.0中除了我们重点讲解的Fragment外,Action Bar也是一个重要的内容,Action Bar主要是用于代替传统的标题栏,对于Android平板设备来说屏幕更大它的标题使 ...
- 解决android自带textview右侧文字不能对齐的问题
package com.sixin.view; import android.content.Context; import android.graphics.Canvas; import andro ...
- [CSAPP笔记][第八章异常控制流][呕心沥血千行笔记]
异常控制流 控制转移 控制流 系统必须能对系统状态的变化做出反应,这些系统状态不是被内部程序变量捕获,也不一定和程序的执行相关. 现代系统通过使控制流 发生突变对这些情况做出反应.我们称这种突变为异常 ...
- Html与css基础
1.html的定义 (1).html:超文本标记语言(HyperText Markup Language),它主要包括"头"(Head)和"主体"(Body)两 ...
- Ajax:Cross-Origin Resource Sharing(转)
实例:http://blog.csdn.net/hongweigg/article/details/39054403 通过XHR实现Ajax通信的一个主要限制,来源于跨域安全策略.默认情况下,XHR对 ...
- C#图像处理(5):无损保存图片
C#使用默认方法对图像进行保存的时候图像会有损失,以下提供无损保存的方法: /// <summary> /// 无损保存图片 /// </summary> /// <pa ...
- AngularJs练习Demo9 Http
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...