分享

iOS_NSAttributeString

 南山岳麓书院 2017-01-05

NSAttributeString属性及方法

NSAttributeString 类的作用是管理字符串和与字符串属性有关联的集合(例如,字体和字距),也称富文本。它适用于单个字符,或字符串某些范围的子字符。字符串与它们的属性相关联后称为属性字符串。本框架下有两个接口,NSAttributeString和 NSMutableAttributedString, 前者用于只读的属性字符串,后者用于可变的属性字符串。具体实现时,NSAttributedString维护了一个NSString,用来保存最原始的字符串,另有一个NSDictionary用来保存各个子串/字符的属性。
NSAttributedString 类的默认字体是 Helvetica体,大小为12-point,这可能与系统平台的默认字体有所不同。因此,你可能需要使用非默认的属性创建新的字符串以适合您的应用。您也可以使用NSParagraphStyle类及其子类NSMutableParagraphStyle封装所用的NSAttributedString类的段落或行距属性。
请注意,比较 NSAttributeString类时应使用 isEqual: 方法进行对比。对比的内容包括两个方面:一是,对逐个字符进行比较;二是,对对应字符的属性进行比较。如果一个字符串包含很多属性,例如attachments, lists, and tables,这样是不容易得到相匹配的结果的。

NSAttributedString核心API:

//字符串
@property (readonly,copy) NSString *string;
//长度
@property (readonly)NSUInteger length;

// 返回属性字符串给定索引处的字符属性
// @ location 需要返回属性处的下标,这个值必须在所接收的字符串索引范围内
// @ range :(如果不为NULL: 1.如果指定索引处存在属性,那么将返回有效索引范围内的属性名称。2. 如果指定索引处不存在属性,那么返回范围内的属性也不存在.)(range并不是必须的,可以传入NULL)
- (NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRangePointer)range;
- (id)attribute:(NSString *)attrName atIndex:(NSUInteger)location effectiveRange:(NSRangePointer)range;

/*
 * @ 提取子字符串
 */
- (NSAttributedString *)attributedSubstringFromRange:(NSRange)range;


/*
 * @ 比较属性字符串
 */
- (BOOL)isEqualToAttributedString:(NSAttributedString *)other;

/*
 * @ 初始化 NSAttributedString 类
 * @ attrs,新属性字符串的属性 键-值 信息,见于 UIKit 框架下 NSAttirbuteString类
 */
// 返回一个用不含属性信息的给定字符串初始化的 NSAttributedString对象
- (instancetype)initWithString:(NSString *)str;
// 返回一个用指定属性信息及给定字符串初始化的 NSAttributedString对象
- (instancetype)initWithString:(NSString *)str attributes:(NSDictionary *)attrs;
// 返回一个用给定字符串及其所带属性初始化的 NSAttributedString对象
- (instancetype)initWithAttributedString:(NSAttributedString *)attrStr;

/*
 *  @ 列举字符串的属性
 */
- (void)enumerateAttributesInRange:(NSRange)enumerationRange 

           options:(NSAttributedStringEnumerationOptions)opts 
                        usingBlock:(void (^)(NSDictionary *attrs,NSRange range, BOOL *stop))block NS_AVAILABLE(10_6,4_0);

- (void)enumerateAttribute:(NSString *)attrName
                   inRange:(NSRange)enumerationRange 
                   options:(NSAttributedStringEnumerationOptions)opts
                usingBlock:(void (^)(id value,NSRange range, BOOL *stop))block NS_AVAILABLE(10_6,4_0);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

NSMutableAttributedString核心API:

@property (readonly,retain) NSMutableString *mutableString;

//替换字符
- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)str;
- (void)replaceCharactersInRange:(NSRange)range withAttributedString:(NSAttributedString *)attrString;

//设置字符串属性
- (void)setAttributes:(NSDictionary *)attrs range:(NSRange)range;

- (void)setAttributedString:(NSAttributedString *)attrString;

//添加字符串属性
- (void)addAttribute:(NSString *)name value:(id)value range:(NSRange)range;
- (void)addAttributes:(NSDictionary *)attrs range:(NSRange)range;

//删除字符串属性
- (void)removeAttribute:(NSString *)name range:(NSRange)range;

//插入NSAttributedString
- (void)insertAttributedString:(NSAttributedString *)attrString atIndex:(NSUInteger)loc;
//拼接NSAttributedString
- (void)appendAttributedString:(NSAttributedString *)attrString;
//删除字符
- (void)deleteCharactersInRange:(NSRange)range;

- (void)beginEditing;
- (void)endEditing;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

NSAttributeString属性测试

代码实现:

self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 50, 320, 500)];
    self.titleLabel.numberOfLines = 0;
    self.titleLabel.layer.borderColor = [UIColor grayColor].CGColor;
    self.titleLabel.layer.borderWidth = 0.5;
    [self.view addSubview:self.titleLabel];


    NSString *string = @"An NSAttributedString object manages character strings and associated sets of attributes (for example, font and kerning) that apply to individual characters or ranges of characters in the string";

    /* 这句话就是对这个类的一个最简明扼要的概括。NSAttributedString管理一个字符串,以及与该字符串中的单个字符或某些范围的字符串相关的属性。它有一个子类NSMutableAttributedString
     * 具体实现时,NSAttributedString维护了一个NSString,用来保存最原始的字符串,另有一个NSDictionary用来保存各个子串/字符的属性。
     */


    /* 三种初始化方法,NSMutableAttributedString没有初始化方法,使用父类初始化方法, 使用initWithString:, initWithString:attributes:, 或者 initWithAttributedString: */

    NSAttributedString *attStri = [[NSAttributedString alloc] initWithString:string attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:30]}];


    NSMutableAttributedString *mAttStri = [[NSMutableAttributedString alloc] initWithString:string];

    /* Character Attributes , 共21个属性名字 */

    /* API: NSFontAttributeName */
    //字体大小 及 字体类型
    NSRange font_range = [string rangeOfString:@"An"];
    [mAttStri addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:30] range:font_range];
    [mAttStri addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Courier-BoldOblique" size:17.0] range:NSMakeRange(10, 10)];

    /* API: NSParagraphStyleAttributeName */
    //值为NSParagraphStyle,设置段落属性,默认值为[NSParagraphStyle defaultParagraphStyle]返回的值。
    /*
     NSMutableParagraphStyle与NSParagraphStyle包括一下属性

     alignment //对齐方式
     firstLineHeadIndent //首行缩进
     headIndent //缩进
     tailIndent  //尾部缩进
     lineBreakMode  //断行方式
     maximumLineHeight  //最大行高
     minimumLineHeight  //最低行高
     lineSpacing  //行距
     paragraphSpacing  //段距
     paragraphSpacingBefore  //段首空间
     baseWritingDirection  //句子方向
     lineHeightMultiple  //可变行高,乘因数。
     hyphenationFactor //连字符属性

     */
    NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
//    style.alignment = NSTextAlignmentCenter;
    style.firstLineHeadIndent = 20;
    style.lineSpacing = 10;

    [mAttStri addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, mAttStri.length)];

    /* NSForegroundColorAttributeName */
    //值为UIColor,字体颜色,默认为黑色。
    [mAttStri addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0, mAttStri.length)];

    /* NSBackgroundColorAttributeName */
    //值为UIColor,字体背景色,默认没有。
    [mAttStri addAttribute:NSBackgroundColorAttributeName value:[UIColor grayColor] range:NSMakeRange(0, 20)];


    /* NSKernAttributeName */
    //值为浮点数NSNumber,字距属性,默认值为0。
    [mAttStri addAttribute:NSKernAttributeName value:@3 range:NSMakeRange(0, mAttStri.length)];

    /* NSStrikethroughStyleAttributeName */
    /*值为整型NSNumber,可取值为
     enum {

        NSUnderlineStyleNone = 0×00,

        NSUnderlineStyleSingle = 0×01,

        };设置删除线。
    */
    [mAttStri addAttribute:NSStrikethroughStyleAttributeName value:@3 range:NSMakeRange(3, 7)];

    /* NSStrikethroughColorAttributeName */
    //这个属性的值是一个UIColor对象。默认值为nil,表示颜色同ForegroundColor相同。
    [mAttStri addAttribute:NSStrikethroughColorAttributeName value:[UIColor blueColor] range:NSMakeRange(3, 3)];



    /* NSUnderlineStyleAttributeName */
    //同上,设置下划线。
    [mAttStri addAttribute:NSUnderlineStyleAttributeName value:@2 range:NSMakeRange(6, 5)];

    /* NSUnderlineColorAttributeName */
    //这个属性的值是一个UIColor对象。默认值为nil,表示颜色同ForegroundColor相同。
    [mAttStri addAttribute:NSUnderlineColorAttributeName value:[UIColor blackColor] range:NSMakeRange(6, 5)];

    /* NSStrokeWidthAttributeName */
    //值为浮点数NSNumber。设置比画的粗细。
    [mAttStri addAttribute:NSStrokeWidthAttributeName value:@10 range:NSMakeRange(50, 30)];

    /* NSStrokeColorAttributeName */
    //值为UIColor,默认值为nil,设置的属性同ForegroundColor。
    [mAttStri addAttribute:NSStrokeColorAttributeName value:[UIColor orangeColor] range:NSMakeRange(50, 20)];

    /* NSShadowAttributeName */
    //值为NSShadow,设置比画的阴影,默认值为nil。
    NSShadow *shadow = [[NSShadow alloc]init];
    shadow.shadowOffset = CGSizeMake(10, 10);
    shadow.shadowColor = [UIColor greenColor];
    [mAttStri addAttribute:NSShadowAttributeName value:shadow range:NSMakeRange(20, 10)];

    /* NSBaselineOffsetAttributeName */
    //此属性的值是包含一个浮点值的NSNumber对象,表示的字符从基线偏移的NSNumber对象,默认值是0。
    [mAttStri addAttribute:NSBaselineOffsetAttributeName value:@5 range:NSMakeRange(112, 10)];

    /* NSObliquenessAttributeName */
    //此属性的值是包含一个浮点值的NSNumber对象,指示倾斜被应用到图形。默认值为0,表示没有倾斜。
    [mAttStri addAttribute:NSObliquenessAttributeName value:@0.8 range:NSMakeRange(135, 15)];

    /* NSLigatureAttributeName */
    //值为整型NSNumber,连字属性,一般中文用不到,在英文中可能出现相邻字母连笔的情况。0为不连笔;1为默认连笔,也是默认值;
    [mAttStri addAttribute:NSLigatureAttributeName value:@0 range:NSMakeRange(0, mAttStri.length)];

    /* NSVerticalGlyphFormAttributeName */
    //值为整型NSNumber,0为水平排版的字,1为垂直排版的字。
    //未看出效果
    [mAttStri addAttribute:NSVerticalGlyphFormAttributeName value:@0 range:NSMakeRange(1, 10)];


    /* NSTextEffectAttributeName */
    //这个属性的值是一个NSString对象,目前只有图版印刷效果可用此。使用此属性设置文本特殊效果,属性的默认值为nil,表示没有文本效应。
    //未看出效果
    [mAttStri addAttribute:NSTextEffectAttributeName value:NSTextEffectLetterpressStyle range:NSMakeRange(80, 10)];


    /* NSLinkAttributeName */
    //此属性的值是NSURL对象(首选)或一个NSString对象。设置链接属性,点击后调用浏览器打开指定URL地址,此属性的默认值为nil,表示没有链接。
    //下文测试


#pragma  mark ** 未测试

    /* NSAttachmentAttributeName */
    //这个属性的值是一个NSTextAttachment对象。设置文本附件,常用于文字图片混排,此属性的默认值为nil,表示无附件。
    //未测试


    /* NSExpansionAttributeName */
    //未测试
    //此属性的值是包含一个浮点值的NSNumber对象,表示的扩展因子被应用到日志的NSNumber对象符号。默认值为0,表示没有扩展。

    /* NSWritingDirectionAttributeName */
    //未测试
    //初步理解为表示嵌套的写作方向



    self.titleLabel.attributedText = mAttStri;

    [self.titleLabel sizeToFit];
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159

NSAttributeString实现UITextView链接

使用 NSLinkAttributeName 属性为textView添加链接:

NSDictionary *attrsDic = @{NSForegroundColorAttributeName: [UIColor blackColor],NSBackgroundColorAttributeName: [UIColor clearColor],NSBaselineOffsetAttributeName: [NSNumber numberWithFloat:5.0],NSKernAttributeName: [NSNumber numberWithFloat:1.0],NSLigatureAttributeName: [NSNumber numberWithFloat:1],NSFontAttributeName:[UIFont systemFontOfSize:16]};

    NSString *text =@"点击进入百度";
    NSMutableAttributedString *attributedstr = [[NSMutableAttributedString alloc]initWithString:text attributes:attrsDic];

    while (true) {
        NSRange range = [text rangeOfString:@"百度" options:NSCaseInsensitiveSearch range:NSMakeRange(0, text.length)];
        if (range.length == 0) {
            break;
        }
        [attributedstr addAttribute:NSLinkAttributeName value:[NSURL URLWithString:@"http://www.baidu.com"] range:range];
        [attributedstr addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInt:NSUnderlineStyleSingle] range:range];

    }

    UITextView *mTextView = [[UITextView alloc]initWithFrame:CGRectMake(10,50,self.view.frame.size.width-20,self.view.frame.size.height-100)];
    mTextView.delegate = self;
    mTextView.editable =NO;
    mTextView.font = [UIFont systemFontOfSize:16];
    mTextView.attributedText = attributedstr;
    [self.view addSubview:mTextView];

    //设置链接的属性

    NSDictionary *linkAttributes =@{NSForegroundColorAttributeName: [UIColor blueColor],NSUnderlineStyleAttributeName: [NSNumber numberWithInt:NSUnderlineStyleSingle]};
    mTextView.linkTextAttributes = linkAttributes;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

点击事件:

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {
    NSLog(@"shouldInteractWithURL:%@", URL);

    return YES; // let the system open this URL
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

使用NSAttributeString实现关键字高亮

#pragma mark - 关键字高亮
//参数为字符串, 返回值类型为一个NSMutableAttributedString(有颜色的字)
- (NSMutableAttributedString *)highLight:(NSString *)str key:(NSString *)key
{

    //创建一个可变NSMutableAttributedString,每次搜索到关键字,就按照所搜索到的关键字位置,将NSMutableAttributedString该处的字符颜色变红
    NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithString:str];

    //将attributedStr所有字符的颜色变白,字符默认颜色为黑色,如果你不想改成白色,这行代码可以删除
    [attributedStr addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, attributedStr.length)];

    //创建一个位置,让它初值为0,以后每次搜索到关键字,让它等于关键字后第一个字符的位置,然后从这个位置开始继续搜索
    NSInteger iLocation =0;
    while (true) {
        //获得关键字在searchStr中出现的位置
        NSRange range = [str rangeOfString:key options:NSCaseInsensitiveSearch range:NSMakeRange(iLocation, str.length - iLocation)];

        //如果没有搜索到关键字,则停止搜索
        if (range.length == 0) {
            break;
        }
        //将attributedStr该位子处的字符串变红
        [attributedStr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:range];

        iLocation = range.location+range.length;
    }
    //返回将关键字变红后的字符串attributedStr
    return attributedStr; 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多