NSAttributeString富文本篇

主要类: NSAttributedString 和 NSMutableAttributedString

** 需要用到的了NSTextAttachment:文本附件,有参考网上代码 **
用法:

  1. 富文本类有点类似于字符串但是他可以实现比字符串更强大的功能,在字符串上给颜色,大小,下划线.介于lable和NSString之间
  2. 可以添加图片附件(NSTextAttachment)微博的emoji表情和文字混搭.(YYKit框架中的lable类)
  3. 实现超链接.(副文本实现超链接,只能通过UITextView实现.

代码1:常见用法

这里仅仅介绍一些有用的键,很多没用的不介绍了.
方式一:
//    方式-(逐条加入键值对,不太好记)
    NSString *str = @"人生若只如初见,何事悲风秋画扇。\n等闲变却故人心,却道故人心易变。\n骊山语罢清宵半,泪雨霖铃终不怨。\n何如薄幸锦衣郎,比翼连枝当日愿。";
    NSMutableAttributedString *aStr = [[NSMutableAttributedString alloc]initWithString:str];
    //    rang表示从哪里开始多长
    //设置字体和设置字体的范围
    [aStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:30.0f] range:NSMakeRange(0, 3)];
    //添加文字颜色
    [aStr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(17, 7)];
    //添加文字背景颜色
    [aStr addAttribute:NSBackgroundColorAttributeName value:[UIColor orangeColor] range:NSMakeRange(17, 7)];
    //添加下划线
    [aStr addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:NSMakeRange(8, 7)];



方式二:(一起添加)
NSString *str1 = @"设置字体格式和大小";
    NSDictionary *dict1 = @{
                            //字体大小
                            NSFontAttributeName :[UIFont systemFontOfSize:33.0f],
                            //前端颜色,显示颜色
                            NSForegroundColorAttributeName : [UIColor redColor],
                            NSBackgroundColorAttributeName : [UIColor orangeColor],
                            //下划线功能,但是没有办法调整距离.需要手动增加控件
                            NSUnderlineStyleAttributeName : [NSNumber numberWithInteger:NSUnderlineStyleSingle],
                            //基线(没什么用).只是一个位置标示,字体对齐和表情的时候好像需要使用
                            NSBaselineOffsetAttributeName:@(5)
                            };
    NSMutableAttributedString *aStr1 = [[NSMutableAttributedString alloc]initWithString:str1 attributes:dict1];

 /*!
     注:NSKernAttributeName用来设置字符之间的间距,取值为NSNumber对象(整数),负值间距变窄,正值间距变宽
     */
    NSString *str4 = @"\n设置字符间距";
    NSDictionary *dictAttr4 = @{NSKernAttributeName:@(4)};
    NSAttributedString *attr4 = [[NSAttributedString alloc]initWithString:str4 attributes:dictAttr4];
    [aStr1 appendAttributedString:attr4];

/*!
     注:NSStrikethroughStyleAttributeName设置删除线,取值为NSNumber对象,枚举NSUnderlineStyle中的值。NSStrikethroughColorAttributeName设置删除线的颜色。并可以将Style和Pattern相互 取与 获取不同的效果
     */
    
    NSString *str51 = @"\n设置删除线为细单实线,颜色为红色";
    NSDictionary *dictAttr51 = @{NSStrikethroughStyleAttributeName:@(NSUnderlineStyleSingle),NSStrikethroughColorAttributeName:[UIColor redColor]};
    NSAttributedString *attr51 = [[NSAttributedString alloc]initWithString:str51 attributes:dictAttr51];
    [aStr1 appendAttributedString:attr51];


代码2:添加图片附件

//设置文本附件NSAttachmentAttributeName,取值为NSTextAttachment对象,常用于文字的图文混排
    NSString *str9 = @"文字的图文混排\n";
    NSTextAttachment *textAttachment = [[NSTextAttachment alloc]init];
    textAttachment.image = [UIImage imageNamed:@"搜索"];
    textAttachment.bounds = CGRectMake(0, 0, 30, 30);
    NSDictionary *dictAttr9 = @{NSAttachmentAttributeName:textAttachment};
    NSAttributedString *attr9 = [[NSAttributedString alloc]initWithString:str9 attributes:dictAttr9];
//添加图片附件
    [aStr1 appendAttributedString:attr9];
//图片附件还可以插入
[aStr1 insertAttributedString: attr9 atIndex:range.location];

//存在两个问题1.图片大小不对,2图片和文字不对齐不居中.
//1. 继承NSTextAttachment重写这个方法,可以使大小相同lineFrag代表本的lable一行的宽高,都取高度才正确
- (CGRect)attachmentBoundsForTextContainer:(NSTextContainer *)textContainer proposedLineFragment:(CGRect)lineFrag glyphPosition:(CGPoint)position characterIndex:(NSUInteger)charIndex {
    return CGRectMake(0, 0, lineFrag.size.height, lineFrag.size.height);
}
//2. 通过基线处理

代码3: 超链接:NSLinkAttributeName属性,但是使用这个有几点注意

之所以把 NSLinkAttributeName 属性单独列出来,是因为在 UILabel 和 UITextField 中是无法使用该属性的。更准确点说是在UILabel 和 UITextField 中无法实现点击链接启动浏览器打开一个URL地址,因为在此过程中用到了一个代理函数。只能用在 UITextView 中。
NSLinkAttributeName 的对象是 NSURL 类型 或 NSString,但是优先使用 NSURL。
需要实现UITextView的代理方法 - (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange,在该方法中,返回 YES,则会打开URL地址,返回 NO则不会.


- (void)test4 {
    NSDictionary *dict = @{
                           // NSURL (preferred) or NSString
                           NSLinkAttributeName : [NSURL URLWithString:@"http://www.baidu.com"]
                           };
    NSAttributedString *aStr = [[NSAttributedString alloc]initWithString:@"百度" attributes:dict];
//    self.lable.attributedText = aStr;
    self.textView.attributedText = aStr;
    //可编辑就不可点击
    self.textView.editable = NO;
    self.textView.delegate = self;
}
#pragma mark - UITextViewDelegate 是否能够连接互联网
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction {
    return YES;
}

列出所有能用到的属性:

NSFontAttributeName, NSForegroundColorAttributeName, NSBackgroundColorAttributeName, NSUnderlineStyleAttributeName, NSBaselineOffsetAttributeName, NSKernAttributeName, NSStrikethroughStyleAttributeName, NSAttachmentAttributeName, NSLinkAttributeName

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容