美文网首页iOS开发-UILabel
设置Label的EdgeInsets以及动态改变label的高度

设置Label的EdgeInsets以及动态改变label的高度

作者: ZYiDa | 来源:发表于2017-04-19 17:34 被阅读165次
    1.设置label的EdgeInsets(内边距)
    代码如下:
    #import <UIKit/UIKit.h>
    @interface EdgeLabel : UILabel
    
    @property(nonatomic, assign) UIEdgeInsets edgeInsets;
    
    @end
    
    
    #import "EdgeLabel.h"
    
    @implementation EdgeLabel
    
    - (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines {
        UIEdgeInsets insets = self.edgeInsets;
        CGRect rect = [super textRectForBounds:UIEdgeInsetsInsetRect(bounds, insets)
                        limitedToNumberOfLines:numberOfLines];
        rect.origin.x    -= insets.left;
        rect.origin.y    -= insets.top;
        rect.size.width  += (insets.left + insets.right);
        rect.size.height += (insets.top + insets.bottom);
        return rect;
    }
    
    - (void)drawTextInRect:(CGRect)rect {
        [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.edgeInsets)];
    }
    @end
    
    
    2.根据字符串动态改变label的高度
    代码如下:
    #import "ViewController.h"
    #import "EdgeLabel.h"
    
    #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
    #define FONT_SIZE 14
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        NSString *titleContent  = @"我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试我的测试";
    
        EdgeLabel *label        = [EdgeLabel new];
        label.numberOfLines     = 0;
        label.edgeInsets        = UIEdgeInsetsMake(0, 10, 10, 10);
        label.textAlignment     = NSTextAlignmentJustified;
        label.font              = [UIFont systemFontOfSize:FONT_SIZE];
        label.textColor         = [UIColor lightGrayColor];
        label.backgroundColor   = [UIColor cyanColor];
        label.text              = titleContent;
        CGSize labelSize        = [titleContent boundingRectWithSize:CGSizeMake(SCREEN_WIDTH - (label.edgeInsets.left + label.edgeInsets.right) , MAXFLOAT)
                                                             options:NSStringDrawingUsesLineFragmentOrigin
                                                          attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:FONT_SIZE]}
                                                             context:nil].size;
        CGFloat realHeight      = (SCREEN_WIDTH  * (labelSize.height + label.edgeInsets.top + label.edgeInsets.bottom))/SCREEN_WIDTH;
        label.frame             = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, realHeight);
        label.center            = self.view.center;
        [self.view addSubview:label];
    }
    
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
    }
    
    
    @end
    
    
    说明

    1.因为我们在动态改变label高度的时候,设置了EdgeInsets,所以需要在

         CGSize labelSize        = [titleContent boundingRectWithSize:CGSizeMake(SCREEN_WIDTH - (label.edgeInsets.left + label.edgeInsets.right) , MAXFLOAT)
                                                             options:NSStringDrawingUsesLineFragmentOrigin
                                                          attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:FONT_SIZE]}
                                                             context:nil].size;
    

    中让SCREEN_WIDTH减去左右内边距的值 (label.edgeInsets.left + label.edgeInsets.right)

    2.然后我们再重新计算高度,让之前的高度值加上label上下内边距的值,即:

        CGFloat realHeight      = (SCREEN_WIDTH  * (labelSize.height + label.edgeInsets.top + label.edgeInsets.bottom))/SCREEN_WIDTH;
    
    最后的效果图如下:
    7A7907FA17D489E47732CF5FCD8A7AAB.png

    相关文章

      网友评论

      • 雨天多久就:楼主,你好!有个问题一直理解不了,还望帮忙解答。 比如,我们要给一个长100,高50的UILabel设置内边距。那不是应该让UILabel的textRect宽度和高度边小,x,y坐标增加吗? 为什么重写那个方法的时候,都是相反的,让textRect的宽度和高度增加,x,y坐标都是减小呢?

      本文标题:设置Label的EdgeInsets以及动态改变label的高度

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