美文网首页iOS开发iOS Developer
UIButton 的 titleEdgeInsets 和 ima

UIButton 的 titleEdgeInsets 和 ima

作者: x5forever | 来源:发表于2017-05-22 16:32 被阅读209次

    UIButton中的titleEdgeInsets和imageEdgeInsets可以管理button中title和image的布局。 如果对其理解不够深入,用纯数字进行布局管理,经过不断的调试,还是能试出来的,但是如果改变了图片大小或文字长度,又要再来一遍。 作为程序猿,我们不应该放弃任何一个偷懒的机会。

    只设置image或title其中一项时,默认是正常居中显示的,但我们同时设置image和title时,则会出现如 <图片1> 的问题,这是为什么呢?那就是当我们同时添加image和title时,image默认会向左偏移button的titleLabel的宽度,而title会向右偏移image的宽度,既然明白了原理,我们就可以设置偏移量来达到我们想要的任何效果。

    默认情况下,图片在左,文字在右,垂直居中显示,如下图:

    button.titleEdgeInsets = UIEdgeInsetsZero;
    button.imageEdgeInsets = UIEdgeInsetsZero;
    
    1

    设置如下布局后,图片和文字都居中显示。

    button.titleEdgeInsets = UIEdgeInsetsMake(0, -button.imageView.frame.size.width, 0, 0);
    // button.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, -button.titleLabel.frame.size.width);
    // 由于iOS8中titleLabel的size为0,用上面这样设置有问题,修改一下即可
    button.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, -button.titleLabel.intrinsicContentSize.width);
    
    2

    如果想图片在上,文字在下,水平居中显示,则按下面设置即可:

    button.titleEdgeInsets = UIEdgeInsetsMake(0, -button.imageView.frame.size.width, -button.imageView.frame.size.height, 0);
    // button.imageEdgeInsets = UIEdgeInsetsMake(-button.titleLabel.frame.size.height, 0, 0, -button.titleLabel.frame.size.width);
    // 由于iOS8中titleLabel的size为0,用上面这样设置有问题,修改一下即可
    button.imageEdgeInsets = UIEdgeInsetsMake(-button.titleLabel.intrinsicContentSize.height, 0, 0, -button.titleLabel.intrinsicContentSize.width);
    
    3

    如果觉得图片和文字离的太近了,稍微分开一点:

    CGFloat offset = 40.0f;button.titleEdgeInsets = UIEdgeInsetsMake(0, -button.imageView.frame.size.width, -button.imageView.frame.size.height-offset/2, 0);
    // button.imageEdgeInsets = UIEdgeInsetsMake(-button.titleLabel.frame.size.height-offset/2, 0, 0, -button.titleLabel.frame.size.width);
    // 由于iOS8中titleLabel的size为0,用上面这样设置有问题,修改一下即可
    button.imageEdgeInsets = UIEdgeInsetsMake(-button.titleLabel.intrinsicContentSize.height-offset/2, 0, 0, -button.titleLabel.intrinsicContentSize.width);
    
    4

    文字左对齐,图片右对齐

    button.titleEdgeInsets = UIEdgeInsetsMake(0, -button.imageView.frame.size.width - button.frame.size.width + button.titleLabel.intrinsicContentSize.width, 0, 0);
    button.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, -button.titleLabel.frame.size.width - button.frame.size.width + button.imageView.frame.size.width);
    
    5

    Note:今天发现个bug,以上方法在iOS8及以下版本,如果button没有设置frame,而是添加的约束(xib 或 Masonry),会导致获取不到 frame.size.width 而造成布局异常。所以,若用以上方法设置button,目前建议使用 frame 布局,约束待后续优化。

    相关文章

      网友评论

        本文标题:UIButton 的 titleEdgeInsets 和 ima

        本文链接:https://www.haomeiwen.com/subject/hgxixxtx.html