zoukankan      html  css  js  c++  java
  • 通过代码创建label 计算最佳尺寸 让其自适应文本高度或宽度

    通过xib创建label  让label随着文本内容的变化而动态改变尺寸比较简单  只要不固定死尺寸就可以了  但是通过代码创建的话我们需要给label设置一个frame  否则label默认是没有尺寸也就不会显示出来的

    但是一旦我们设置了frame label的尺寸也就固定了  所以我们需要通过另外的属性来获取最佳的尺寸从而设置label的尺寸达到最佳的显示效果:

    sizeThatFits

    // return 'best' size to fit given size. does not actually resize view. Default is return existing view size

    //会根据输入的文本长度  返回“最佳”大小适合给定的大小

    使用:

            //首先创建一个label
            UILabel *nameLabel = [[UILabel alloc]init];
            nameLabel.font = [UIFont systemFontOfSize:14];
           //在设置frame之前要给label一个初始化的文字 没有文字的话label是没有尺寸的
            nameLabel.text = @"  ";
          //设置想要的效果:比如说我想让label宽度固定 高度不固定  那我只需要设置好宽度就可以了   高度的话可以随便给个值
            CGSize maximumLabelSize = CGSizeMake([UIScreen mainScreen].bounds.size.width - nameLabel.x-10, 9999);//labelsize的最大值
          //根据文本内容返回最佳的尺寸
            CGSize expectSize = [nameLabel sizeThatFits:maximumLabelSize];
         //设置label的frame
            nameLabel.frame = CGRectMake(CGRectGetMaxX(iconBtn.frame)+20, iconBtn.y+5,expectSize.width,expectSize.height);
         //设置文字对齐方式
            nameLabel.textAlignment = NSTextAlignmentLeft;
            [self.contentView addSubview:nameLabel];

    如果后面需要更改label中的文字内容或者重新赋值  还需要重新设置label的frame或者尺寸:

        //这个x与y是我在我的代码中设置的 不是固定的 要根据实际需求去设置  主要是长度与宽度的设置
        CGSize maximumLabelSize = CGSizeMake([UIScreen mainScreen].bounds.size.width - _nickName.x-10, 30);//labelsize的最大值
        CGSize expectSize = [_nickName sizeThatFits:maximumLabelSize];
        _nickName.frame = CGRectMake(CGRectGetMaxX(self.icon.frame)+20, self.icon.y+5,expectSize.width,expectSize.height);

    效果图:

    另外  我们经常会用到TTTAttributedLabel去达到某个功能 或者实现某个效果  效果图中的评论部分就是继承自TTTAttributedLabel的  行间距是自定义的  所以在计算最佳尺寸的时候 TTTAttributedLabel重写了sizeThatFits方法:

    - (CGSize)sizeThatFits:(CGSize)size {
        if (!self.attributedText) {
            return [super sizeThatFits:size];
        } else {
            NSMutableAttributedString *fullString = [[NSMutableAttributedString alloc] initWithAttributedString:self.attributedText];
            
            if (self.attributedTruncationToken) {
                [fullString appendAttributedString:self.attributedTruncationToken];
            }
            
            NSAttributedString *string = [[NSAttributedString alloc] initWithAttributedString:fullString];
            
            CGSize labelSize = CTFramesetterSuggestFrameSizeForAttributedStringWithConstraints([self framesetter], string, size, (NSUInteger)self.numberOfLines);
            labelSize.width += self.textInsets.left + self.textInsets.right;
            labelSize.height += self.textInsets.top + self.textInsets.bottom;
    
            return labelSize;
        }
    }

    所以即使是TTTAttributedLabel也能像普通label一样计算出最佳尺寸

    注意:

      1.设置lable大小的时候需要先进行lable的text赋值  否则label会没有尺寸

         2.如果要将lable居中显示的话,lable.center属性的设置必须放在设置新大小之后,不然会出现不居中的情况

  • 相关阅读:
    javascript功能插件大集合
    基于Swiper插件的简单轮播图的实现
    LeetCode24. 两两交换链表中的节点
    530. 二叉搜索树的最小绝对差
    416. 分割等和子集
    GAN ——Generative Adversarial Network 理解与推导(一)
    面试题 02.08. 环路检测(返回环路开头节点)
    141.环形链表-LeetCode
    357. 计算各个位数不同的数字个数 ——LeetCode
    LSTM的理解
  • 原文地址:https://www.cnblogs.com/gaoxiaoniu/p/5340277.html
Copyright © 2011-2022 走看看