美文网首页iOSiOS DeveloperiOS 开发
iOS-设置UILabel的内边距

iOS-设置UILabel的内边距

作者: xiaoaihhh | 来源:发表于2016-07-01 17:25 被阅读18545次
    Paste_Image.png

    问题说明

    默认Label的显示效果如下


    很多情况下,需要如下有内边距的效果(注意第一行与最后一行文字与label的上下边距

    解决方案

    为了解决这个问题,设计SFLabel如下,继承自UILabel

    #import "SFLabel.h"
    #import <UIKit/UIKit.h>
    
    @interface SFLabel ()
    // 用来决定上下左右内边距,也可以提供一个借口供外部修改,在这里就先固定写死
    @property (assign, nonatomic) UIEdgeInsets edgeInsets;
    @end
    
    @implementation SFLabel
    
    
    //下面三个方法用来初始化edgeInsets
    - (instancetype)initWithFrame:(CGRect)frame
    {
        if(self = [super initWithFrame:frame])
        {
            self.edgeInsets = UIEdgeInsetsMake(25, 0, 25, 0);
        }
        return self;
    }
    
    - (instancetype)initWithCoder:(NSCoder *)aDecoder
    {
        if (self = [super initWithCoder:aDecoder]) {
            self.edgeInsets = UIEdgeInsetsMake(25, 0, 25, 0);
        }
        return self;
    }
    
    - (void)awakeFromNib
    {
       [super awakeFromNib];
        self.edgeInsets = UIEdgeInsetsMake(25, 0, 25, 0);
    }
    
    // 修改绘制文字的区域,edgeInsets增加bounds
    -(CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines
    {
    
        /*
        调用父类该方法
        注意传入的UIEdgeInsetsInsetRect(bounds, self.edgeInsets),bounds是真正的绘图区域
        */
        CGRect rect = [super textRectForBounds:UIEdgeInsetsInsetRect(bounds,
         self.edgeInsets) limitedToNumberOfLines:numberOfLines];
        //根据edgeInsets,修改绘制文字的bounds
        rect.origin.x -= self.edgeInsets.left;
        rect.origin.y -= self.edgeInsets.top;
        rect.size.width += self.edgeInsets.left + self.edgeInsets.right;
        rect.size.height += self.edgeInsets.top + self.edgeInsets.bottom;
        return rect;
    }
    
    //绘制文字
    - (void)drawTextInRect:(CGRect)rect
    {
        //令绘制区域为原始区域,增加的内边距区域不绘制
        [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.edgeInsets)];
    }
    
    @end
    

    将UIlabel的类型改为SFLabel,看看现在效果是否如第二幅图😊。

    注意事项

    • 通过SFLabel中的方法修改UILabel的内边距最好只修改上下内边距,通过系统NSMutableParagraphStyle可以修改左边内边距;
    • 通过boundingRectWithSize:options:attributes:context:计算SFLabel内容计算出的区域仍然是与直接使用UILabel的结果一样,因此需要小心使用,可以在boundingRectWithSize:options:attributes:context:基础上根据edgeInsets进行修正。

    SFLabel源码

    相关文章

      网友评论

      • 杯中怎可无酒:UILabel没有属性可以直接修改吗
      • 贼海鸥:我想要上下左右的边距一样,但是根本不行.如果要加一个sizeToFit,那么label的width就会被改变,怎么办?
        贼海鸥:@小艾哈哈哈 不是很好.最后,我该的是修改他的宽度和高度,才好
        xiaoaihhh:把edgeInsets设置为上下左右一样,sizetofit不就是自己计算么
      • Leo_Favor:666 很有帮助
      • bc973163d996:解决问题
      • doubleJJ:请问一下,通过NSMutableParagraphStyle怎么设置左右边距呢,网上找了很多都是上下边距的:cold_sweat:
        xiaoaihhh:修改edgeInsets就可以设置左右了
      • iOS_Gato_老猫:作者你好~我设置内边距 左右距离5的时候 出现 字。。。显示不下的问题 请问你碰到过么
        邓俊杰:作者的方案并不会根据宽度变化重新计算文字高度,所以会出现“...”
      • championfu:为什么不用类别,而去选择继承呢
        Madlife_ZYC:分类runtime?
        困惑困惑困惑:如何使用类别呢
      • 十一岁的加重:好方法,已经实践,可用
      • 40c6620494c9:rect.size.width += self.edgeInsets.left + self.edgeInsets.right;
        rect.size.height += self.edgeInsets.top + self.edgeInsets.bottom; 这个宽度我看不太明白 为什么宽度不是减去self.edgeInsets.left -self.edgeInsets.right;反而是加呢
        JustCompile:@偶像MJ rect.origin.x -= self.edgeInsets.left;
        rect.origin.y -= self.edgeInsets.top; 这两句话不要也可以,你试试
        40c6620494c9:@十一岁的加重
        CGRect rect = [super textRectForBounds:UIEdgeInsetsInsetRect(bounds,
        self.edgeInsets) limitedToNumberOfLines:numberOfLines];这个传入的bounds 已经是合适的了,这样得出来的rect 不是合适的?还需要后续再调整?
        十一岁的加重:@偶像MJ edgeInsets是额外的区域,相对于没有edgeInsets的label来说,这块不管为负为正都得加

      本文标题:iOS-设置UILabel的内边距

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