IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    获取NSString的宽高

    键盘上的舞者发表于 2016-10-23 10:09:41
    love 0

    在给UILabel设置宽高的时候,会出现这样的问题,当你的字符串很长的时候,UILabel显示就是省略号了,这样子肯定是不行的,尤其是自定义cell的时候,cell中包含UILabel,这样就需要去动态的计算高度。

    给NSString添加一个category

    //
    //  NSString+LabelWidthAndHeight.h
    //  ZiPeiYi
    //
    //  Created by YouXianMing on 15/12/9.
    //  Copyright © 2015年 YouXianMing. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    
    @interface NSString (LabelWidthAndHeight)
    
    /**
     *  Get the string's height with the fixed width.
     *
     *  @param attribute String's attribute, eg. attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:18.f]}
     *  @param width     Fixed width.
     *
     *  @return String's height.
     */
    - (CGFloat)heightWithStringAttribute:(NSDictionary <NSString *, id> *)attribute fixedWidth:(CGFloat)width;
    
    /**
     *  Get the string's width.
     *
     *  @param attribute String's attribute, eg. attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:18.f]}
     *
     *  @return String's width.
     */
    - (CGFloat)widthWithStringAttribute:(NSDictionary <NSString *, id> *)attribute;
    
    /**
     *  Get a line of text height.
     *
     *  @param attribute String's attribute, eg. attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:18.f]}
     *
     *  @return String's width.
     */
    + (CGFloat)oneLineOfTextHeightWithStringAttribute:(NSDictionary <NSString *, id> *)attribute;
    
    @end

    //
    //  NSString+LabelWidthAndHeight.m
    //  ZiPeiYi
    //
    //  Created by YouXianMing on 15/12/9.
    //  Copyright © 2015年 YouXianMing. All rights reserved.
    //
    
    #import "NSString+LabelWidthAndHeight.h"
    
    @implementation NSString (LabelWidthAndHeight)
    
    - (CGFloat)heightWithStringAttribute:(NSDictionary <NSString *, id> *)attribute fixedWidth:(CGFloat)width {
        
        NSParameterAssert(attribute);
        
        CGFloat height = 0;
        
        if (self.length) {
            
            CGRect rect = [self boundingRectWithSize:CGSizeMake(width, MAXFLOAT)
                                             options:NSStringDrawingTruncatesLastVisibleLine |NSStringDrawingUsesLineFragmentOrigin |
                           NSStringDrawingUsesFontLeading
                                          attributes:attribute
                                             context:nil];
            
            height = rect.size.height;
        }
        
        return height;
    }
    
    - (CGFloat)widthWithStringAttribute:(NSDictionary <NSString *, id> *)attribute {
        
        NSParameterAssert(attribute);
        
        CGFloat width = 0;
        
        if (self.length) {
            
            CGRect rect = [self boundingRectWithSize:CGSizeMake(MAXFLOAT, 0)
                                             options:NSStringDrawingTruncatesLastVisibleLine |NSStringDrawingUsesLineFragmentOrigin |
                           NSStringDrawingUsesFontLeading
                                          attributes:attribute
                                             context:nil];
            
            width = rect.size.width;
        }
        
        return width;
    }
    
    + (CGFloat)oneLineOfTextHeightWithStringAttribute:(NSDictionary <NSString *, id> *)attribute {
        
        CGFloat height = 0;
        CGRect rect    = [@"One" boundingRectWithSize:CGSizeMake(200, MAXFLOAT)
                                              options:NSStringDrawingTruncatesLastVisibleLine |NSStringDrawingUsesLineFragmentOrigin |
                          NSStringDrawingUsesFontLeading
                                           attributes:attribute
                                              context:nil];
        
        height = rect.size.height;
        return height;
    }
    
    @end

    给UILabel设置完text之后,用siteToFit方法更新一下。



沪ICP备19023445号-2号
友情链接