关于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的坐标就是左边推进的高度。
posted @ 2015-06-08 04:44  sixleaves  阅读(4493)  评论(3编辑  收藏  举报