#import <Foundation/Foundation.h> @interface NSString (Extension) - (CGFloat)heightWithLimitWidth:(CGFloat)width fontSize:(CGFloat)fontSize otherAttributes:(NSDictionary *)otherAttributes; - (CGFloat)widthWithLimitHeight:(CGFloat)height fontSize:(CGFloat)fontSize otherAttributes:(NSDictionary *)otherAttributes; - (CGSize)sizeWithLimitSize:(CGSize)size fontSize:(CGFloat)fontSize otherAttributes:(NSDictionary *)otherAttributes; - (CGRect)rectWithSize:(CGSize)size fontSize:(CGFloat)fontSize otherAttributes:(NSDictionary *)otherAttributes; //属性字符串 指定子串变色 - (NSMutableAttributedString *)attributedStringWithcolor:(UIColor *)color subString:(NSString *)subString; // 属性字符串 指定子串变色 多处 - (NSMutableAttributedString *)attributedStringWithColorArray:(NSArray *)colorArray subStringArray:(NSArray *)subStringArray; //属性字符串 指定子串改变显示效果 - (NSMutableAttributedString *)attributedStringWithAttributeds:(NSDictionary *)attributeds subString:(NSString *)subString; /** 转变指定字符串 @param regArray 正则表达式数组 @param attributeds 指定属性 @return 返回的可变字符串 */ - (NSMutableAttributedString *)changeStringWithReg:(NSArray *)regArray attributeds:(NSDictionary *)attributeds; // 将url中的参数转为字典 - (NSMutableDictionary *)getURLParameters; /** 插入图片 @param images 图片数组 @param font 字体 @param span 间距 @return 结果 */ -(NSMutableAttributedString *)attributedStringWithImages:(NSArray<UIImage *> *)images font:(UIFont *)font imageSpan:(CGFloat)span; @end
#import "NSString+Extension.h" @implementation NSString (Extension) - (CGFloat)heightWithLimitWidth:(CGFloat)width fontSize:(CGFloat)fontSize otherAttributes:(NSDictionary *)otherAttributes { return [self rectWithSize:CGSizeMake(width, CGFLOAT_MAX) fontSize:fontSize otherAttributes:otherAttributes].size.height; } - (CGFloat)widthWithLimitHeight:(CGFloat)height fontSize:(CGFloat)fontSize otherAttributes:(NSDictionary *)otherAttributes { return [self rectWithSize:CGSizeMake(CGFLOAT_MAX, height) fontSize:fontSize otherAttributes:otherAttributes].size.width; } - (CGSize)sizeWithLimitSize:(CGSize)size fontSize:(CGFloat)fontSize otherAttributes:(NSDictionary *)otherAttributes { return [self rectWithSize:size fontSize:fontSize otherAttributes:otherAttributes].size; } - (CGRect)rectWithSize:(CGSize)size fontSize:(CGFloat)fontSize otherAttributes:(NSDictionary *)otherAttributes { NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithDictionary:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]}]; if (otherAttributes) { for (NSString *aKey in otherAttributes.allKeys) { id aValue = [otherAttributes objectForKey:aKey]; [dictionary setObject:aValue forKey:aKey]; } } return [self boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:dictionary context:nil]; } - (NSMutableAttributedString *)attributedStringWithcolor:(UIColor *)color subString:(NSString *)subString { NSMutableAttributedString * attributedString = [[NSMutableAttributedString alloc] initWithString:self]; if (![subString isKindOfClass:[NSString class]] || !subString.length) { return attributedString; } NSRange range = [self rangeOfString:subString]; if (range.location != NSNotFound) { [attributedString addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(range.location, range.length)]; } return attributedString; } - (NSMutableAttributedString *)attributedStringWithColorArray:(NSArray *)colorArray subStringArray:(NSArray *)subStringArray { NSMutableAttributedString * attributedString = [[NSMutableAttributedString alloc] initWithString:self]; NSInteger count = subStringArray.count; if (count<2) { return [self attributedStringWithcolor:colorArray[0] subString:subStringArray[0]]; } for (NSInteger i=0; i<count; i++) { NSString *subString= subStringArray[i]; if (![subString isKindOfClass:[NSString class]] || !subString.length) { return attributedString; } NSRange range = [self rangeOfString:subString]; if (range.location != NSNotFound) { [attributedString addAttribute:NSForegroundColorAttributeName value:colorArray[i] range:NSMakeRange(range.location, range.length)]; } } return attributedString; } - (NSMutableAttributedString *)attributedStringWithAttributeds:(NSDictionary *)attributeds subString:(NSString *)subString{ NSMutableAttributedString * attributedString = [[NSMutableAttributedString alloc] initWithString:self]; if (![subString isKindOfClass:[NSString class]] || !subString.length) { return attributedString; } NSRange range = [self rangeOfString:subString]; if (range.location != NSNotFound) { // [attributedString addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(range.location, range.length)]; [attributedString addAttributes:attributeds range:NSMakeRange(range.location, range.length)]; } return attributedString; } /** 转变指定字符串 @param regArray 正则表达式数组 @param attributeds 指定属性 @return 返回的可变字符串 */ - (NSMutableAttributedString *)changeStringWithReg:(NSArray *)regArray attributeds:(NSDictionary *)attributeds{ NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:self]; for (int i=0; i<regArray.count; i++) { NSString *re = [regArray ty_ObjectWithIndex:i]; NSRegularExpression *regExp = [[NSRegularExpression alloc]initWithPattern:re options:NSRegularExpressionDotMatchesLineSeparators error:nil]; NSArray* match = [regExp matchesInString:self options:NSMatchingReportCompletion range:NSMakeRange(0, [self length])]; if (match.count != 0) { for (NSTextCheckingResult *matc in match) { NSRange range = [matc range]; [attr addAttributes:attributeds range:range]; } } } return attr; } /** 插入图片 @param images 图片数组 @param font 字体 @param span 间距 @return 结果 */ -(NSMutableAttributedString *)attributedStringWithImages:(NSArray<UIImage *> *)images font:(UIFont *)font imageSpan:(CGFloat)span{ NSMutableAttributedString *textAttrStr = [[NSMutableAttributedString alloc] init]; for (UIImage *img in images) { NSTextAttachment *attach = [[NSTextAttachment alloc] init]; attach.image = img; CGFloat imgH = font.pointSize; CGFloat imgW = (img.size.width / img.size.height) * imgH; attach.bounds = CGRectMake(0, -2 , imgW, imgH); NSAttributedString *imgStr = [NSAttributedString attributedStringWithAttachment:attach]; [textAttrStr appendAttributedString:imgStr]; //标签后添加空格 [textAttrStr appendAttributedString:[[NSAttributedString alloc] initWithString:@" "]]; } [textAttrStr appendAttributedString:[[NSAttributedString alloc]initWithString:self]]; //设置间距 if (span != 0) { [textAttrStr addAttribute:NSKernAttributeName value:@(span) range:NSMakeRange(0, images.count * 2/*由于图片也会占用一个单位长度,所以带上空格数量,需要 *2 */)]; } return textAttrStr; } - (NSMutableDictionary *)getURLParameters { // 查找参数 NSRange range = [self rangeOfString:@"?"]; if (range.location == NSNotFound) { return nil; } NSMutableDictionary *params = [NSMutableDictionary dictionary]; // 截取参数 NSString *parametersString = [self substringFromIndex:range.location + 1]; // 判断参数是单个参数还是多个参数 if ([parametersString containsString:@"&"]) { // 多个参数,分割参数 NSArray *urlComponents = [parametersString componentsSeparatedByString:@"&"]; for (NSString *keyValuePair in urlComponents) { // 生成Key/Value NSArray *pairComponents = [keyValuePair componentsSeparatedByString:@"="]; NSString *key = [pairComponents.firstObject stringByRemovingPercentEncoding]; NSString *value = [pairComponents.lastObject stringByRemovingPercentEncoding]; // Key不能为nil if (key == nil || value == nil) { continue; } id existValue = [params valueForKey:key]; if (existValue != nil) { // 已存在的值,生成数组 if ([existValue isKindOfClass:[NSArray class]]) { // 已存在的值生成数组 NSMutableArray *items = [NSMutableArray arrayWithArray:existValue]; [items addObject:value]; [params setValue:items forKey:key]; } else { // 非数组 [params setValue:@[existValue, value] forKey:key]; } } else { // 设置值 [params setValue:value forKey:key]; } } } else { // 单个参数 // 生成Key/Value NSArray *pairComponents = [parametersString componentsSeparatedByString:@"="]; // 只有一个参数,没有值 if (pairComponents.count == 1) { return nil; } // 分隔值 NSString *key = [pairComponents.firstObject stringByRemovingPercentEncoding]; NSString *value = [pairComponents.lastObject stringByRemovingPercentEncoding]; // Key不能为nil if (key == nil || value == nil) { return nil; } // 设置值 [params setValue:value forKey:key]; } return params; } @end