您的位置:68399皇家赌场 > 集群主机 > iOS 关于UILabel文本的自适应

iOS 关于UILabel文本的自适应

发布时间:2019-09-17 03:20编辑:集群主机浏览(139)

    UIView方法之SizeToFit

    一、前言
    近些日子来了二个新安插,将App的风格修改了贰次。在显示文字时,扩充了行间距。原来认为只是呈现和测算中度的时候增加上富文本的lineSpace属性就能够,不过结果在展现一行汉语的时候,却怎么也算算字体的时候多了二个行间距的万丈,呈现的Label也多了多个行间距的中度。经过查找资料,网络也会有人境遇一样的坑。总结中度时,需求将判定一下是不是汉语与一行,尽管是一行带普通话何况有行间距,此时完整高度应该减去行间距。显示的Label假使用的是自适应中度,也理应做一下推断,一行普通话带行间距时,不设置Label的lineSpace属性。若是你也遇上那样坑,能够因而本小说的德姆o化解,并打包好一些艺术,便于以往的使用。

    对此Label的长度和中度难点,每一回碰到都要写一群代码来鲜明其bounds,所以写成了项目方便使用。这里做个记录,非常少说一向上代码。

    以下依照具体情形举个例子表达演示

    效能: 计算出最优size, 何况改动UIView的size

    二、文本获取中度的不二等秘书籍:
    无独有偶计算文本的惊人使用以下三种格局,通过总括出来的可观计算父控件的总中度。


    // 例子文本
    NSArray *contents = @[
                        @"人生若只如初见,何事秋风悲画扇!",
                        @"sjkf基地哦激发我 i 肌肤 i 哦文件软件  啊数据分类健身房逻辑啊谁来减肥减父爱数据佛 i 为 i 即佛 i   的风景啊啥的减肥卡姐搜附近的减肥就啊苦尽甘来将阿拉大方接受逻辑法拉盛觉得饭卡老骥伏枥科技馆 i 哦额阿胶糕就就          看见饿了科技 呃呃呃 就         就发生减肥的卢卡斯了风景啊数据的       结尾 i 呃减肥的风景咖色九分裤     减肥 i 哦少女尽快形成女奴诶混空间室内卡夫卡里嘎多   的飞机上的减肥空间啊是克己复礼撒娇的风景啊是关乎恶搞八廓街看风景啊可是发动机空间"
                          ];
    

    德姆o1: 中度不改变,宽度随文本大小变化而生成安装字号为13,使用SizeToFit自适应结果为

    经过UILabel sizeThatFits获取文本的莫大
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 1)];
    label.font = [UIFont systemFontOfSize:14]; label.numberOfLines = 0; label.attributedText = attributeString;
    CGSize size = [label sizeThatFits:CGSizeMake(label.frame.size.width, CGFLOAT_MAX)];
    NSLog(@"size:%@", NSStringFromCGSize(size));
    NSLog(@"label.frame.size:%@", NSStringFromCGSize(label.frame.size));
    boundingWithRect
    NSString *text = @"恰同学少年,风度翩翩";
    NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:text];
    NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; style.lineSpacing = 10;
    [attributeString addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, text.length)];
    [attributeString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:14] range:NSMakeRange(0, text.length)]; NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;
    CGRect rect = [attributeString boundingRectWithSize:CGSizeMake(100, MAXFLOAT) options:options context:nil];
    三、粤语富文本有行间距的坑:
    总计文字中度的坑:
    以上三种总计办法在企图包涵汉语,并且有行间距的富文本时,会现出在测算一行时,文本中度不对,多了二个行间距的冲天。但在妄想纯爱尔兰语时却不会存在那一个场合。那样会招致在设有父控件时,父控件完整中度总结不对。

    开创项目-->UILabel Frame


     UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 100, 40)]; label.backgroundColor = [UIColor whiteColor]; label.textAlignment = NSTextAlignmentCenter; label.font = [UIFont systemFontOfSize:13]; label.text = @"天青色等烟雨n而我在等你n炊烟袅袅升起n隔江千万里"; [self.view addSubview:label]; [label sizeToFit]; NSLog(@"frame = %@", NSStringFromCGRect(label.frame));
    

    Paste_Image.png
    给Label设置文本的坑:
    在给Label设置富文本时,倘若是单排并且带中文,何况安装了距离lineSpace,结果多发掘突显出来多了贰个间距的中度。


    单行文本

    UILabel打印结果为:frame = {{20, 100}, {307, 16}}

    Paste_Image.png
    四、解决方案:
    测算文字高度的坑:
    判别行数与是或不是留存普通话,当行数为一行,並且存在汉语时,需求将总括结果的莫斯中国科学技术大学学减去行间距。此时才为不易文本正确中度。
    给Label设置文本的坑:
    急需判断是还是不是超越一行,超越一行不设置富文本的lineSpace。
    //文本的中度减去字体高度小于等于行间距,推断为当下唯有1行
    if ((rect.size.height - _font.lineHeight) <= paragraphStyle.lineSpacing){
    if ([self containChinese:str]) { //固然蕴涵中文
    rect = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height-paragraphStyle.lineSpacing);
    }
    }

    .h中

    1、通过 text 字符串总括size

     UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(20, 100, 100, 40)]; btn.backgroundColor = [UIColor whiteColor]; [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; btn.titleLabel.font = [UIFont systemFontOfSize:13]; [btn setTitle:@"天青色等烟雨n而我在等你n炊烟袅袅升起n隔江千万里" forState:UIControlStateNormal]; [self.view addSubview:btn]; [btn sizeToFit]; NSLog(@"frame = %@", NSStringFromCGRect(btn.frame));
    

    //推断假若带有普通话

    /**升幅不改变,自动拉伸高度*/

    - (void)contentFitHeight;

    /**惊人不改变,适应自字体的增幅*/

    - (void)contentFitWidth;

    方法:

    UIButton打字与印刷结果为:frame = {{20, 100}, {540, 28}}

    • (BOOL)containChinese:(NSString *)str {
      for(int i=0; i< [str length];i ){ int a = [str characterAtIndex:i];
      if( a > 0x4e00 && a < 0x9fff){
      return YES;
      }
      }
      return NO;
      }

    .m 中

    - (CGSize)sizeWithAttributes:(nullable NSDictionary<NSString *, id> *)attrs;
    
     UITextField *field = [[UITextField alloc] initWithFrame:CGRectMake(20, 100, 100, 40)]; field.backgroundColor = [UIColor whiteColor]; field.text = @"天青色等烟雨n而我在等你n炊烟袅袅升起n隔江千万里"; field.font = [UIFont systemFontOfSize:13]; [self.view addSubview:field]; [field sizeToFit]; NSLog(@"frame = %@", NSStringFromCGRect(field.frame));
    

    Paste_Image.png
    五、封装与使用(便于未来的使用)
    对NSString举行以下情势的充实。

    - (void)contentFitHeight {

    /**(可用)方法太蠢:扬弃*/

    //    self.numberOfLines = 0;

    //    CGSize size = CGSizeMake(self.frame.size.width,CGFLOAT_MAX);

    //    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];

    //    paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;

    //    NSDictionary *attributes = @{NSFontAttributeName:self.font};

    //    CGSize newSize = [self.text boundingRectWithSize:size options:NSStringDrawingUsesFontLeading|NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil].size;

    //    self.bounds = CGRectMake(0, 0, newSize.width, newSize.height);

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, 0)];

    label.text = self.text;

    label.font = self.font;

    label.numberOfLines = 0;

    [label sizeToFit];

    CGFloat height = label.frame.size.height;

    self.numberOfLines = 0;

    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y,  self.frame.size.width, height);

    }

    - (void)contentFitWidth {

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, CGFLOAT_皇家赌场 ,MAX, 0)];

    label.text = self.text;

    label.font = self.font;

    [label sizeToFit];

    CGFloat width = label.frame.size.width;

    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, width, self.frame.size.height);

    }

    例子:

    UITextField打字与印刷结果为:** frame = {{20, 100}, {544, 16}}**

    /**


    self.contentLabel.font = [UIFont systemFontOfSize:20];
    self.contentLabel.text = contents.firstObject;
    // 根据文本计算size,这里需要传入attributes
    CGSize sizeNew = [self.contentLabel.text sizeWithAttributes:@{NSFontAttributeName:self.contentLabel.font}];
    // 重新设置frame
    self.contentLabel.frame = CGRectMake(0, 0, sizeNew.width, sizeNew.height);
    // 输出此时控件的大小
    NSLog(@"%@",NSStringFromCGSize(self.contentLabel.frame.size));
    self.contentLabel.center = self.view.center;
    

    那儿八个控件都以单行形式下,中度不改变,宽度随文本大小变化而变化.但UILabel是有设置多行成效的,所以UILabel和UIButton均可安装多行,请看德姆o2

    • 计量文字中度,能够管理总结带行间距的
      */

    初叶用的是安装属性的诀窍,通过艺术获得Label的宽高并展开frame的修改。

    输出的size

    德姆o2: 宽度不改变,高度随文本大小变化而改动安装宽度为100,UILabel的numberOfLines大于1行,即使为3行若自适应后的幅度小于100,则升幅小于100,高为一行假使自适应后的小幅度超过100,则上涨的幅度为100,若中度当先3行,则中度为3行,剩余内容不显示,若高度小于三行,则中度为计算出的莫斯中国科学技术大学学

    后来读书外人代码时候开掘越来越好的主意:正是新创造贰个Label来获取宽高,很便捷。

    皇家赌场 1

     UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 100, 40)]; label.textAlignment = NSTextAlignmentCenter; label.backgroundColor = [UIColor whiteColor]; label.font = [UIFont systemFontOfSize:13]; label.numberOfLines = 3; label.text = @"天青色等烟雨n而我在等你n炊烟袅袅升起n隔江千万里"; [self.view addSubview:label]; [label sizeToFit]; NSLog(@"frame = %@", NSStringFromCGRect(label.frame));
    
    • (CGSize)boundingRectWithSize:(CGSize)size font:(UIFont*)font lineSpacing:(CGFloat)lineSpacing
      {
      NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:self];
      NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
      paragraphStyle.lineSpacing = lineSpacing;
      [attributeString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, self.length)];
      [attributeString addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, self.length)];
      NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;
      CGRect rect = [attributeString boundingRectWithSize:size options:options context:nil];

    sizeWithAttributes

    UIlabel打字与印刷结果为:frame = {{20, 100}, {97, 47}}

    // NSLog(@"size:%@", NSStringFromCGSize(rect.size));

    学无止境,做个记录

    label的样式

    德姆o3: 宽度不改变,低度随文本大小变化而生成设置宽度为100,UILabel的numberOfLines为0行若自适应后的上涨的幅度小于100,则上涨的幅度小于100,高为一行要是自适应后的增加率抢先100,则上升的幅度为100,中度为自适应后的万丈

    //文本的高度减去字体高度小于等于行间距,判断为当前只有1行
    if ((rect.size.height - font.lineHeight) <= paragraphStyle.lineSpacing) {
        if ([self containChinese:self]) {  //如果包含中文
            rect = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height-paragraphStyle.lineSpacing);
        }
    }
    
    
    return rect.size;
    

    2017-01-09-SXH

    皇家赌场 2

    专一:中度自适应时,宽度不得设置为0,若为0,则改为了单行宽度自适应但恰恰自适应算出来的坐标,上下左右均紧贴着Label的边,不佳看,可做如下修饰

    }

    样式

    label.width  = 10;label.height  = 10;
    

    //推断如果含有中文

    2、通过 attributedText 富文本间接总结size

    皇家赌场 3皇家赌场 4

    • (BOOL)containChinese:(NSString )str {
      for(int i=0; i< [str length];i ){ int a = [str characterAtIndex:i];
      if( a > 0x4e00 && a < 0x9fff){
      return YES;
      }
      }
      return NO;
      }
      /
      *

    方法:

    UIView方法之sizeThatFits
    - (CGSize)size;
    

    作用: 总计出最优size, 可是不会转移UIView的size用法: 将sizeThatFits的宽高设置非常的大点,会在这几个范围内机关总括出最相称宽高若总结的肥瘦弱于设置的肥瘦,则以计算出来的中度为准若总结的大幅超过设置的增长幅度,则以设置的增长幅度去开展中度自适应注意:若要自适应,要重设Label坐标

    • 算算最大行数文字中度,能够拍卖总结带行间距的
      */

    例子:

     UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 100, 20)]; label.backgroundColor = [UIColor whiteColor]; label.textAlignment = NSTextAlignmentCenter; label.font = [UIFont systemFontOfSize:13]; label.numberOfLines = 0; label.text = @"天青色等烟雨n而我在等你n炊烟袅袅升起n隔江千万里"; [self.view addSubview:label]; CGSize sizeThat = [label sizeThatFits:CGSizeMake(1000, 1000)]; label.frame = CGRectMake(20, 100, sizeThat.width, sizeThat.height); NSLog(@"frame = %@", NSStringFromCGSize);
    
    self.contentLabel.font = [UIFont systemFontOfSize:20];
    self.contentLabel.text = contents.firstObject;
    // 计算文本size
    CGSize sizeNew = [self.contentLabel.attributedText size];
    self.contentLabel.frame = CGRectMake(0, 0, sizeNew.width, sizeNew.height);
    // 输出此时控件的大小
    NSLog(@"%@",NSStringFromCGSize(self.contentLabel.frame.size));
    self.contentLabel.center = self.view.center;
    

    UIlabel打印结果为:(因为有换行,所以测算出)frame = {80, 62.5}

    • (CGFloat)boundingRectWithSize:(CGSize)size font:(UIFont*)font lineSpacing:(CGFloat)lineSpacing maxLines:(NSInteger)maxLines{

      if (maxLines <= 0) {
      return 0;
      }

      CGFloat maxHeight = font.lineHeight * maxLines lineSpacing * (maxLines - 1);

      CGSize orginalSize = [self boundingRectWithSize:size font:font lineSpacing:lineSpacing];

      if ( orginalSize.height >= maxHeight ) {
      return maxHeight;
      }else{
      return orginalSize.height;
      }
      }
      /**

    此时的size

    NSString方法之boundingRectWithSize

    皇家赌场 5

     _boundingRectWithSizeLabel.numberOfLines = 0; _boundingRectWithSizeLabel.font = [UIFont systemFontOfSize:18]; NSString *strText = @"这是一段很长的文字,你需要计算这个高度到底是多少"; _boundingRectWithSizeLabel.text = strText; NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObject:[UIFont systemFontOfSize:18] forKey:NSFontAttributeName]; CGSize size = [strText boundingRectWithSize:CGSizeMake(100, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size; _boundingRectWithSizeLabel.frame = CGRectMake(15, _h5TextView.bottom   30, size.width, size.height);
    
    • 测算是不是超过一行 用于给Label 赋值attribute text的时候 当先一行设置lineSpace
      */

    frame

    NSAttributedString方法之boundingRectWithSize

    label的样式

     _boundingRectWithSizeAttributedLabel.numberOfLines = 0; _boundingRectWithSizeAttributedLabel.font = [UIFont systemFontOfSize:13]; NSString *h5boundingRectWithSizeString = @"<p>天青色等烟雨,而我在等你,炊烟袅袅升起,隔江千万里,在瓶底书汉隶仿前朝的飘逸,就当我为遇见你伏笔,天青色等烟雨,而我在等你,月色被打捞起,晕开了结局,如传世的青花瓷自顾自美丽,你眼带笑意,色白花青的锦鲤跃然於碗底,临摹宋体落款时却惦记着你,你隐藏在窑烧里千年的秘密,极细腻犹如绣花针落地,帘外芭蕉惹骤雨,门环惹铜绿,而我路过那江南小镇惹了你,在泼墨山水画里,你从墨色深处被隐去</p>"; NSMutableAttributedString *h5boundingRectWithSizeAttributedString = [[NSMutableAttributedString alloc] initWithData:[h5boundingRectWithSizeString dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil]; _boundingRectWithSizeAttributedLabel.attributedText = h5boundingRectWithSizeAttributedString; CGSize size1 = [h5boundingRectWithSizeAttributedString boundingRectWithSize:CGSizeMake(100, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading context:nil].size; _boundingRectWithSizeAttributedLabel.frame = CGRectMake(15, _boundingRectWithSizeLabel.bottom   30, size1.width, size1.height);
    
    • (BOOL)isMoreThanOneLineWithSize:(CGSize)size font:(UIFont *)font lineSpaceing:(CGFloat)lineSpacing{

      if ( [self boundingRectWithSize:size font:font lineSpacing:lineSpacing].height > font.lineHeight ) {
      return YES;
      }else{
      return NO;
      }
      }

    皇家赌场 6

    样式

    3、通过UIView的 sizeThatFits

    方法:

    本文由68399皇家赌场发布于集群主机,转载请注明出处:iOS 关于UILabel文本的自适应

    关键词: ios实用 笔记 日记本 基础 ios

上一篇:iOS动画原理--隐式动画

下一篇:没有了