自动计算文本高度iOS


#import <Foundation/Foundation.h>

@interface NSString (Size)
// 真实的高度
+ (CGFloat)getStrH:(CGFloat ) maxW Str:(NSString *)str andFont:(NSInteger) font;
// 向上取整高度
+ (CGFloat)getStrCeilH:(CGFloat ) maxW Str:(NSString *)str andFont:(NSInteger) font;
/**
 根据字体、行间距和constrainedWidth计算文本高度
 @param font 字体
 @param lineSpacing 行间距
 @param constrainedWidth 文本受限的宽度
 */
- (CGFloat)getStrH:(UIFont*)font
       lineSpacing:(CGFloat)lineSpacing
  constrainedWidth:(CGFloat)constrainedWidth;

- (CGFloat)getStrH:(UIFont*)font
       lineSpacing:(CGFloat)lineSpacing
  constrainedWidth:(CGFloat)constrainedWidth
         limitRows:(NSInteger) limitRows;

+ (NSString *)appendStr:(NSString*) str sepStr:(NSString *)sepStr strArray:(NSArray *)strs;


/**
 *  是否是空串
 *
 *  @return
 */
-(BOOL)isNull;
/**
 *  删除两端空格
 *
 *  @return
 */
-(NSString *)stringDeleteEndsWhiteSpace;
/**
 *  删除换行符和两端空格
 *
 *  @return
 */
-(NSString *)stringDeleteWhitespaceAndNewline;
/**
 *  删除所有空格
 *
 *  @return
 */
-(NSString *)stringDeleteAllWhiteSpace;
/**
 *  删除特定串
 *
 *  @param str 特定串
 *
 *  @return
 */
-(NSString *)stringDeleteStr:(NSString*)str;
/**
 *  替换特定串
 *
 *  @param str 旧串
 *  @param str 新串
 *
 *  @return
 */
-(NSString *)stringReplaceStr:(NSString*)oldStr withStr:(NSString*)newStr;
/**
 *  分割
 *
 *  @param str 标志
 *
 *  @return 分割后数组
 */
-(NSArray*)stringCompanentsByStr:(NSString*)str;
/**
 *  逆序
 *
 *  @return
 */
-(NSString*)stringReverse;
/**
 *  c 转 oc
 *
 *  @param str c串
 *
 *  @return oc串
 */
-(NSString*)stringChangeFromeC:(char *) str;
/**
 *  oc 转 c
 *
 *  @return c 串
 */
-(const char*)cString;
/**
 *  特定字符
 *
 *  @param index 索引
 *
 *  @return 特定字符
 */
-(char)charInString:(NSInteger) index;
@end


#import "NSString+Size.h"

@implementation NSString (Size)

// 真实的高度
+ (CGFloat)getStrH:(CGFloat ) maxW Str:(NSString *)str andFont:(NSInteger) font
{
    if (!str.length) return 0;
    CGRect itemFrame = [str boundingRectWithSize:CGSizeMake(maxW, CGFLOAT_MAX) options: NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading  attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:font]} context:nil];
    return  itemFrame.size.height;
    
}
// 向上取整高度
+ (CGFloat)getStrCeilH:(CGFloat ) maxW Str:(NSString *)str andFont:(NSInteger) font
{
    if (!str.length) return 0;
    CGRect itemFrame = [str boundingRectWithSize:CGSizeMake(maxW, CGFLOAT_MAX) options: NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading  attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:font]} context:nil];
    CGSize size = itemFrame.size;
    return ceil(size.height);
    
}

- (CGFloat)getStrH:(UIFont*)font
       lineSpacing:(CGFloat)lineSpacing
  constrainedWidth:(CGFloat)constrainedWidth {
    
    if (!self.length) {
        return 0;
    }
    CGFloat oneLineHeight = font.lineHeight;
    CGSize textSize = [self boundingRectWithSize:CGSizeMake(constrainedWidth, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil].size;
    
    CGFloat rows = textSize.height / oneLineHeight;
    CGFloat realHeight = (rows * oneLineHeight) + (rows - 1) * lineSpacing;
    return  realHeight;
}

- (CGFloat)getStrH:(UIFont*)font
       lineSpacing:(CGFloat)lineSpacing
  constrainedWidth:(CGFloat)constrainedWidth
         limitRows:(NSInteger) limitRows{
    
    if (!self.length) {
        return 0;
    }
    CGFloat oneLineHeight = font.lineHeight;
    CGSize textSize = [self boundingRectWithSize:CGSizeMake(constrainedWidth, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil].size;
    
    CGFloat rows = textSize.height / oneLineHeight;
    if (limitRows > 0 && rows > limitRows) {
        rows = limitRows;
    }
    CGFloat realHeight = (rows * oneLineHeight) + (rows - 1) * lineSpacing;
    return  realHeight;
}

+ (NSString *)appendStr:(NSString*) str sepStr:(NSString *)sepStr strArray:(NSArray *)strs
{
    if (strs.count && sepStr.length)
    {
        for (NSInteger i = 0; i< strs.count; i++)
        {
            if (i == 0)
            {
                if (!str.length)
                {
                    str = [NSString stringWithString:strs[i]];
                }
                else
                {
                    str = [str stringByAppendingString:strs[i]];
                }
                
            }
            else
            {
                NSString *tempStr = [NSString stringWithFormat:@"%@%@",sepStr,strs[i]];
                str = [str stringByAppendingString:tempStr];
            }
        }
    }
    
    return str;
}


#pragma mark strAction
-(BOOL)isNull
{
    return (!self || [self isEqualToString:@""]) ? YES : NO ;
}
-(NSString *)stringDeleteEndsWhiteSpace
{
    return  [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
}
-(NSString *)stringDeleteWhitespaceAndNewline
{
    return  [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

-(NSString *)stringDeleteAllWhiteSpace
{
    return [self stringByReplacingOccurrencesOfString:@" " withString:@""];
}
-(NSString *)stringDeleteStr:(NSString *)str
{
    return [self stringByReplacingOccurrencesOfString:str withString:@""];
}
-(NSString *)stringReplaceStr:(NSString*)oldStr withStr:(NSString*)newStr
{
    return [self stringByReplacingOccurrencesOfString:oldStr withString:newStr];
}
-(NSString*)stringReverse
{
    NSMutableString* reveseStr = [NSMutableString stringWithString:self];
    for(int i = 0 ; i < self.length; i ++)
    {
        unichar c = [self characterAtIndex:self.length- i -1];
        [reveseStr appendFormat:@"%c",c];
    }
    return (NSString*)reveseStr;
}

-(NSArray*)stringCompanentsByStr:(NSString*)str
{
    return [self componentsSeparatedByString:str];
}
-(NSString*)stringChangeFromeC:(char *) str
{
    return [NSString stringWithUTF8String:str];
}
-(const char*)cString
{
    return [self UTF8String];
}
-(char)charInString:(NSInteger) index
{
    
    return [self characterAtIndex:index];
}

@end

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值