ios计算字符串宽高,指定字符串变色,获取URL参数集合

#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

  

原文地址:https://www.cnblogs.com/likun123/p/9518664.html