注:通常的label用来现实普通的文字。但是,你常常会遇到这样的情况:一段文字中不仅有文字,也有图片,甚至文字中的某段文字与其他的文字的appearance不一致的情况,这样的一段文字就可以称得上是富文本了。label的attributedText属性就是用来接受这样的文本内容的。

场景

  • 如图

    • 若你遇到这样的需求,不妨考虑一下使用NSAttributedString了创建这样的文本。如果这段文字具有点击事件,实现方法有以下两种:

      • 将这段文字设置为button的attributedTitle
      • 将这段文字设置为label的attributedText,并给label添加点击手势

实现思路

  • 这段文字由图片和文字共同组成

    • 将图片封装到NSTextAttachment实例中,然后通过NSAttributedString的类构造方法初始化为NSAttributedString实例。
    • 使用NSMutableDictionary来封装文本的现实属性
    • 使用NSAttributedString的对象方法addAttributes:range:改变指定范围文字的现实属性

具体实现

  • 集成Masonry框架

  • 创建pch文件

    • pch文件通常的命名方法:项目名-prefix.pch,如:AttributedStringInLabel-Prefix.pch

    • pch文件的配置

    • 将通用的头文件添加到pch文件中

  • 定义通过RGBA创建UIColor对象的宏

    • 我们通常会将经常使用的方法定义成宏,来提高开发效率和屏蔽复杂操作

    • 带参数的宏定义中的参数名,不能与其后的形式参数名相同(宏定义其实就是替换,将文本替换成指定的文本)

      // redValue 不能写成red
      #define UIColorWithInt(redValue, greenValue, blueValue, alphaValue) [UIColor colorWithRed:(redValue)/255.0f green:(greenValue)/255.0f blue:(blueValue)/255.0f alpha:(alphaValue)]
  • alertLabel

    • 包含alertLabel属性

      @interface ViewController ()
      /** alertLabel */
      @property (nonatomic, strong) UILabel *alertLabel;
      @end
    • 创建alertLabel

      - (void)viewDidLoad {
      [super viewDidLoad];
      // 创建alertLabel
      self.alertLabel = [[UILabel alloc] init];
      [self.view addSubview:self.alertLabel];
      // 设置alertLabel的富文本属性
      [self setupAlertLabel];
      }
    • 使用Masonry框架布局alertLabel的位置

      • 若是在控制器中,通常在viewDidLayoutSubviews方法中布局子控件

      • 若是自定以控制,通常在layoutSubviews方法中布局子控件

        /**
        * 布局alertLabel
        */
        - (void)viewDidLayoutSubviews {
        [super viewDidLayoutSubviews];
        [self.alertLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerX.centerY.equalTo(self.view);
        }];
        }
    • 设置alertLabel的attributedText属性

      /**
      * 设置alertLabel
      */
      - (void)setupAlertLabel {
      // 文本的显示样式
      NSMutableDictionary *appearanceDictionary = [NSMutableDictionary dictionary];
      appearanceDictionary[NSForegroundColorAttributeName] = UIColorWithInt(117, 117, 117, 1.0);
      appearanceDictionary[NSFontAttributeName] = [UIFont boldSystemFontOfSize:15];
      // 文本内容(指定显示属性的文本)
      NSString *normolString = @" 莫将支付宝密码告诉他人,谢谢!";
      NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:normolString attributes:appearanceDictionary];
      // 改变文本中某段文字的现实属性
      NSMutableDictionary *subAppearanceDictionary = [NSMutableDictionary dictionary];
      subAppearanceDictionary[NSForegroundColorAttributeName] = [UIColor redColor];
      subAppearanceDictionary[NSFontAttributeName] = [UIFont systemFontOfSize:17];
      NSRange subRange = [normolString rangeOfString:@"谢谢!"];
      [attributedString addAttributes:subAppearanceDictionary range:subRange];
      // 添加图片
      NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
      attachment.image = [UIImage imageNamed:@"alert"];
      attachment.bounds = CGRectMake(0, 0, 14, 14);
      NSAttributedString *imageString = [NSAttributedString attributedStringWithAttachment:attachment];
      [attributedString insertAttributedString:imageString atIndex:0];
      // 设置alertLabel的attributedText
      self.alertLabel.attributedText = attributedString;
      // 给alertLabel添加点击事件
      [self addTargetToAlertLabel];
      }
    • 给alertLabel添加点击手势

      • UILabel对象默认是不具备与用户交互的能力,若要保证添加的手势有效果,需要是其具备与用户交互的能力

        - (void)addTargetToAlertLabel {
        self.alertLabel.userInteractionEnabled = YES;
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(alertLabelClick:)];
        [self.alertLabel addGestureRecognizer:tap];
        }
        /**
        * alertLabel的点击事件
        */
        - (void)alertLabelClick:(UILabel *)label {
        NSLog(@"alertLabelClick");
        }

VVDocument

  • VVDocument是一款快速编写注释的Xcode插件,但是升级Xcode之后,出现了VVDocument不可用的情况,以下是解决方案

    • 打开“Finder”->“应用程序”->“Xcode”->"显示包内容"->"contents"->"Info.plist",拷贝如图所示内容

    • command+shift+G,进入指定路径文件夹:~/Library/Application Support/Developer/Shared/Xcode

      • “显示包内容”->“Contents”->"Info.plist", 新建Item,粘贴拷贝的字符串

    • 重启Xcode,使用三个斜杠(///)来使用VVDocument

UILabel和NSAttributedString那些事的更多相关文章

  1. UILabel中NSAttributedString和其LinebarkModel等属性之间的关系

    如果设置了一个富文本给一个UILabel,那么后续改变这个UILabel的属性时将会同时改变UILabel.attributedText的属性描述,此时若改变了其它的大小.换行模式(如果在显示时我们可 ...

  2. NSAttributedString设置行间距,间接设置了uilabel的行间距

    假设有UIlabel实例:_testLabel NSString * testString = @"明月当空,隐隐约约听到低吟,似有若无.面对大千世界的奢华糜烂,还不如在这一方小城,静静品一 ...

  3. 解决NSAttributedString与UILabel高度自适应计算问题

    两个类扩展方法: /** *  修改富文本的颜色 * *  @param str   要改变的string *  @param color 设置颜色 *  @param range 设置颜色的文字范围 ...

  4. UILabel添加图片之富文本的简单应用

    若想对UILabel添加图片,那么就需要使用NSMutableAttributedString来定义先定义一个普通的label UILabel *lab = [[UILabel alloc]initW ...

  5. 你真的了解UIButton、UILabel 吗?

    一:首先查看一下关于UIButton的定义 @class UIImage, UIFont, UIColor, UIImageView, UILabel; //设置UIButton的样式 typedef ...

  6. iOS开发小技巧--即时通讯项目:使用富文本在UILabel中显示图片和文字;使用富文本占位显示图片

    Label借助富文本显示图片 1.即时通讯项目中语音消息UI的实现,样式如图: 借助富文本在UILabel中显示图片和文字 // 1.创建一个可变的富文本 NSMutableAttributedStr ...

  7. 优化UITableViewCell高度计算的那些事

    优化UITableViewCell高度计算的那些事 我是前言 这篇文章是我和我们团队最近对 UITableViewCell 利用 AutoLayout 自动高度计算和 UITableView 滑动优化 ...

  8. UILabel 的高度根据文字内容调整

    1.UILabel 对文字的自适应有两种方法. 1)将label的numberOfLines设为0;并添加自适应方法[titleLabel sizeToFit],但是这种方法并不理想. 2)根据文字的 ...

  9. Multi-line NSAttributedString with truncated text

    http://stackoverflow.com/questions/7611816/multi-line-nsattributedstring-with-truncated-text/1017279 ...

随机推荐

  1. 【转载】[jquery.validate]自定义方法实现"手机号码或者固定电话"的逻辑验证

    最近项目开发中遇到这样的需求“手机号码或者固话至少填写一个”,如下图所示: 项目采用的jquery.validate.js验证组件,目前组件不支持这种“或”逻辑的验证,于是就自己定义一个 jQuery ...

  2. ASP.NET MVC Layout 嵌套

    模板页Layout.cshtml代码(路径"~/Views/Backstage/MachineMng/Layout.cshtml"): @{ ViewBag.Title = &qu ...

  3. Bootstrap学习笔记系列5------Bootstrap图片显示

    通过添加一下的class来实现bootstrap对图片的支持 img-round 通过border-radius:6px 来获得图片圆角 img-circle 通过border-radius:50%来 ...

  4. Win8 app判断网络连接状态

    Win8 app判断网络连接状态 NetworkInformation.NetworkStatusChanged += NetworkInformation_NetworkStatusChanged; ...

  5. 如何向非技术人(程序猿)解释SQL注入?

    前两天看博客园新闻,有一篇文章名为<我该如何向非技术人解释SQL注入?>(http://kb.cnblogs.com/page/515151/).是一个外国人写的,伯乐在线翻译的.我当时看 ...

  6. WinForm小白的WPF初试一:从PropertyGrid控件,输出内容到Word(上)

    学WinForm也就半年,然后转到WPF,还在熟悉中.最近拿到一个任务:从PropertyGrid控件,输出内容到Word.难点有: 一.PropertyGrid控件是WinForm控件,在WPF中并 ...

  7. Hack语言类型化简介

    在typechecker的配合下,Hack语言的类型化能力是Hack其他功能特性的基石.开发Hack语言的主要动机也正是为代码提供显式类型标注以便对代码进行类型一致性和潜在错误分析. 这是用于对比Ha ...

  8. 数据操作语言DML与运算符

    数据操作语言DML(添加,修改,删除) 1.添加数据 insert into insert into 表名 (字段列表) values (值列表),值列表要和字段列表按顺序匹配. insert int ...

  9. soap缓存问题

    问题描述: ws提供方在原有基础上增加了一个方法,通过php的soap扩展硬是获取不到该方法,提示,该方法不存在. 问题跟节: soap缓存问题,导致无法获取最新的ws文件信息 解决办法: 1.直接在 ...

  10. iOS 获取网络图片的大小

    一直都在找关于获取网络图片的大小的方法, 今天找到了一个能解决的办法 ,如下 1, 导入框架 #import <ImageIO/ImageIO.h> 2. 使用此方法得到image的siz ...