美文网首页
NSAttributedString 带属性的字符串

NSAttributedString 带属性的字符串

作者: 沁晓Chr | 来源:发表于2015-12-22 18:27 被阅读2701次

    NSAttributedString 带属性的字符串

    • set都是改变之前的设置或取代同类.比如设置代理,通常代理只是一个对象属性,重复设置,也只有一个,具体起作用看情况
    • add都是添加,补充之前的设置,或添加同类.比如添加target,添加消息,addOberver等等,都是添加到集合,每个添加的都有效
      ![image](images/屏幕快照 2015-11-09 15.25.16.png)
       // setAttributes:(字典),是设置改变Attributes字典指向(Attributes字典存字符串属性的所有键值对),改变属性字典指向了,之前设置的无效
       //addAttribute:(键值对)/addAttributes:(字典)往Attributes字典调加属性设置的键值对或字典,未改变属性字典指向,之前设置的非同一key的有效.
        //方法名规律
       // set都是改变之前的设置或取代同类.add都是添加,补充之前的设置,或添加同类
    
    NSString:NSObject//无属性字符串,不可变
    NSAtrributedString:NSObject//带属性字符串
    //属性和字符串都不可变,一创建好就不可变
    
    每个字符独立接收属性(range,批量设置范围内的所有字符,但每个字符独立接收属性)
    重复设置同一字符(在同一字符串中位置相同),最后一次有效
    
    • 例子利用TextField的attributedPlaceholder来探讨NSAttributedString
    @property(nullable, nonatomic,copy)   NSAttributedString     *attributedPlaceholder;
    
    • NSAttributedString不可变.(类NSString)字符串和属性在创建后,不可变.(用之创建新字符串不是)
    带有属性的字符串, 富文本
    由2部分组成
    文字内容 : NSString *
    文字属性 : NSDictionary *
    文字颜色 - NSForegroundColorAttributeName
    字体大小 - NSFontAttributeName
    下划线 - NSUnderlineStyleAttributeName
    背景色 - NSBackgroundColorAttributeName
    
        NSMutableDictionary *attributes = [NSMutableDictionary dictionary];
        attributes[NSForegroundColorAttributeName] = [UIColor yellowColor];
        attributes[NSBackgroundColorAttributeName] = [UIColor redColor];
        attributes[NSUnderlineStyleAttributeName] = @YES;
        //创建新的属性字符串,创建后不可变(非指针指向不可变,而是字符串本身和属性不可变).所以创建时就要设置好属性
        self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.placeholder attributes:attributes];
    
    • NSMutableAttributedString可变(类NSMutableString)字符串和属性在创建后,可变.
     ////创建新的属性字符串,创建后可变,
      NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:self.placeholder];
      // 创建后改变属性
      NSMutableDictionary *attributes = [NSMutableDictionary dictionary];
      attributes[NSForegroundColorAttributeName] = [UIColor yellowColor];
      //1set
      [string setAttributes:attributes range:NSMakeRange(0, 1)];
      
      NSMutableDictionary *attributes2 = [NSMutableDictionary dictionary];
      attributes2[NSBackgroundColorAttributeName] = [UIColor redColor];
      attributes2[NSUnderlineStyleAttributeName] = @YES;
      
     // setAttributes:(字典),是设置改变Attributes字典指向(Attributes字典存字符串属性的所有键值对),改变属性字典指向了,之前设置的//1set无效,因为属性作用是在每个字符的,//2setRange(0, 2)包含了//1setRange(0, 1)中的字符所以//1set被覆盖了属性
     
     //2set
      [string setAttributes:attributes2 range:NSMakeRange(0, 2)];
      
      //addAttribute:(键值对)/addAttributes:(字典)往Attributes字典调加属性设置的键值对或字典,未改变属性字典指向,之前设置的非同一key的有效.
      [string addAttribute:NSForegroundColorAttributeName value:[UIColor yellowColor] range:NSMakeRange(0, 1)];
      [string addAttribute:NSBackgroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0, 1)];
      [string addAttribute:NSUnderlineStyleAttributeName value:@YES range:NSMakeRange(1, 1)];
      self.attributedPlaceholder = string;
    
    
    • UILabel利用
    UILabel *label = [[UILabel alloc] init];
    //    label.text = @"你好哈哈哈";
        NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:@"你好哈哈哈"];
        [text addAttribute:NSForegroundColorAttributeName value:[UIColor yellowColor] range:NSMakeRange(0, 3)];
        [text addAttribute:NSBackgroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(2, 3)];
        label.attributedText = text;
        label.frame = CGRectMake(100, 100, 100, 25);
        [self.view addSubview:label];
    
    
    • 一个lbale两行字,不同属性
        UILabel *label = [[UILabel alloc] init];
        // 设置属性文字
        NSString *text = @"你好\n哈哈哈";
        NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:text];
        [attributedText addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:10] range:NSMakeRange(0, text.length)];
        [attributedText addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:13] range:NSMakeRange(3, 3)];
        label.attributedText = attributedText;
        // 其他设置
        label.numberOfLines = 0;
        label.textAlignment = NSTextAlignmentCenter;
        label.frame = CGRectMake(0, 0, 100, 40);
        [self.view addSubview:label];
        self.navigationItem.titleView = label;
    
    • 利用属性字符串,进行label的图文混排
      UILabel *label = [[UILabel alloc] init];
        label.frame = CGRectMake(100, 100, 200, 25);
        label.backgroundColor = [UIColor redColor];
        label.font = [UIFont systemFontOfSize:14];
        [self.view addSubview:label];
    
        // 图文混排
        NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] init];
        // 1 - 你好
        NSAttributedString *first = [[NSAttributedString alloc] initWithString:@"你好"];
        [attributedText appendAttributedString:first];
    
        // 2 - 图片
        // 带有图片的附件对象
        NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
        attachment.image = [UIImage imageNamed:@"header_cry_icon"];
        CGFloat lineH = label.font.lineHeight;
        attachment.bounds = CGRectMake(0, - ((label.xmg_height - lineH) * 0.5 - 1), lineH, lineH);
        // 将附件对象包装成一个属性文字
        NSAttributedString *second = [NSAttributedString attributedStringWithAttachment:attachment];
        [attributedText appendAttributedString:second];
    
        // 3 - 哈哈哈
        NSAttributedString *third = [[NSAttributedString alloc] initWithString:@"哈哈哈"];
        [attributedText appendAttributedString:third];
    
        label.attributedText = attributedText;
        
    

    相关文章

      网友评论

          本文标题:NSAttributedString 带属性的字符串

          本文链接:https://www.haomeiwen.com/subject/ruxvhttx.html