有趣的文字 - NSAttributedString

忙活了大半年,公司项目终于可以上线了。趁着现在工作不那么紧张,总结一下项目中遇到的一些好玩的需求。这次先分享一个NSAttributedString以及在开发过程中用到的小工具。
个人博客地址
GitHub地址

OK! Talk is cheep, show me the code!

一、Easy example - 小试牛刀

创建一个Label

NSString *str = @"这句话就是对这个类的一个最简明扼要的概括。NSAttributedString管理一个字符串,以及与该字符串中的单个字符或某些范围的字符串相关的属性。它有一个子类NSMutableAttributedString。具体实现时,NSAttributedString维护了一个NSString,用来保存最原始的字符串,另有一个NSDictionary用来保存各个子串/字符的属性。";
    
UILabel *attributeLabel = [[UILabel alloc] initWithFrame:CGRectMake(40, 100, 200, 400)];
attributeLabel.numberOfLines = 0;
attributeLabel.layer.borderColor = [UIColor grayColor].CGColor;
attributeLabel.layer.borderWidth = 0.5;
attributeLabel.textAlignment = NSTextAlignmentLeft;
[self.view addSubview:attributeLabel];

设置文字属性

NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:str];
NSRange range = [str rangeOfString:@"这"];
[attrString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:30] range:range];
[attrString addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Courier-BoldOblique" size:17.0] range:NSMakeRange(20, 10)];

attributeLabel.attributedText = attrString;

来,看一下效果!

@Easy example NSAttributedString

二、Introduce - 简单介绍

上述案例中,我们使用了UILabel来展示文字,那么拥有该属性的控件还有UITextFieldUITextView。使用NSAttributeString我们可以实现很多有趣的效果,下面来介绍一下它都可以实现什么效果吧。

NSAttributedString 共有21个属性

// 上面例子中用过这个属性,字体 - 默认字体:Helvetica(Neue),字号:12
1. NSFontAttributeName

// 段落 - 取值为 NSParagraphStyle 对象,文本段落排版格式,行间距等
2. NSParagraphStyleAttributeName

// 字体颜色 - 默认为黑色
3. NSForegroundColorAttributeName

// 字体背景颜色 - 默认为无背景色
4. NSBackgroundColorAttributeName

// 连体字符 - 该属性所对应的值是一个 NSNumber 对象(整数)。连体字符是指某些连在一起的字符,它们采用单个的图元符号。0 表示没有连体字符。1 表示使用默认的连体字符。2表示使用所有连体符号。默认值为 1(注意,iOS 不支持值为 2)。
5. NSLigatureAttributeName

// 设置字符间距,取值为 NSNumber 对象(整数),正值间距加宽,负值间距变窄 
6. NSKernAttributeName

// 删除线 - 取值为 NSNumber 对象(整数)
7. NSStrikethroughStyleAttributeName

// 设置删除线颜色,取值为 UIColor 对象,默认值为黑色
8. NSStrikethroughColorAttributeName 

// 下划线,取值为 NSNumber 对象(整数),枚举常量 NSUnderlineStyle中的值,与删除线类似
9. NSUnderlineStyleAttributeName 

// 下划线颜色,UIColor 对象,默认值为黑色
10. NSUnderlineColorAttributeName  

// 笔画宽度(粗细),取值为 NSNumber 对象(整数),负值填充效果,正值中空效果
11. NSStrokeWidthAttributeName 

// 填充部分颜色,不是字体颜色,取值为
12. NSStrokeColorAttributeName

// 阴影属性,取值为 NSShadow 对象
13. NSShadowAttributeName 

// 文本特殊效果,取值为 NSString 对象,目前只有图版印刷效果可用
14. NSTextEffectAttributeName 

// 设置基线偏移值,取值为 NSNumber (float),正值上偏,负值下偏
15. NSBaselineOffsetAttributeName 

// 设置字形倾斜度,取值为 NSNumber (float),正值右倾,负值左倾
16. NSObliquenessAttributeName 

// 文本横向拉伸属性,取值为 NSNumber (float),正值横向拉伸文本,负值横向压缩文本
17. NSExpansionAttributeName 

// 设置文字书写方向,从左向右书写或者从右向左书写
18. NSWritingDirectionAttributeName

// 文字排版方向,取值为 NSNumber 对象(整数),0 表示横排文本,1 表示竖排文本
19. NSVerticalGlyphFormAttributeName

// 设置链接属性,点击后调用浏览器打开指定URL地址
20. NSLinkAttributeName 

// 设置文本附件,取值为NSTextAttachment对象,常用于文字图片混排
21. NSAttachmentAttributeName

具体要说明一下第二条NSParagraphStyleAttributeNameNSParagraphStyle对象,
它包括以下属性:

1.alignment // 对齐方式
2.firstLineHeadIndent // 首行缩进
3.headIndent // 缩进
4.tailIndent // 尾部缩进
5.lineBreakMode // 断行方式
6.maximumLineHeight // 最大行高
7.minimumLineHeight // 最低行高
8.lineSpacing // 行距
9.paragraphSpacing // 段距
10.paragraphSpacingBefore // 段首空间
11.baseWritingDirection // 句子方向
12.lineHeightMultiple // 可变行高,乘因数。
13.hyphenationFactor // 连字符属性

三、挨个试试

2. NSParagraphStyleAttributeName - 字段落

NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
style.firstLineHeadIndent = 30;
style.lineSpacing = 10;
style.lineBreakMode = NSLineBreakByWordWrapping;
    
[attrString addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, str.length)];
@NSParagraphStyleAttributeName

3. NSForegroundColorAttributeName - 字色

[attrString addAttribute:NSForegroundColorAttributeName value:[UIColor colorWithRed:0.90 green:0.44 blue:0.38 alpha:1.00] range:NSMakeRange(0, str.length)];

4. NSBackgroundColorAttributeName - 字背景色

[attrString addAttribute:NSBackgroundColorAttributeName value:[UIColor colorWithRed:0.53 green:0.77 blue:0.48 alpha:1.00] range:NSMakeRange(0, str.length)];
@NSForegroundColorAttributeName - NSBackgroundColorAttributeName

5. NSLigatureAttributeName

6. NSKernAttributeName - 字间距

[attrString addAttribute:NSKernAttributeName value:@3 range:NSMakeRange(0, str.length)];

7. NSStrikethroughStyleAttributeName - 删除线

[attrString addAttribute:NSStrikethroughStyleAttributeName value:@1 range:NSMakeRange(22, 10)];

8. NSStrikethroughColorAttributeName - 删除线颜色

[attrString addAttribute:NSStrikethroughColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(24, 6)];
@NSKern-NSStrikethrough-NSStrikethroughColor

9. NSUnderlineStyleAttributeName

[attrString addAttribute:NSUnderlineStyleAttributeName value:@3 range:NSMakeRange(33, 10)];

10. NSUnderlineColorAttributeName

[attrString addAttribute:NSUnderlineColorAttributeName value:[UIColor colorWithRed:1.00 green:0.30 blue:0.00 alpha:1.00] range:NSMakeRange(36, 4)];
@NSUnderlineStyle-NSUnderlineColor

11. NSStrokeWidthAttributeName

[attrString addAttribute:NSStrokeWidthAttributeName value:@10 range:NSMakeRange(40, 6)];

12. NSStrokeColorAttributeName

[attrString addAttribute:NSStrokeColorAttributeName value:[UIColor colorWithRed:1.00 green:0.89 blue:0.18 alpha:1.00] range:NSMakeRange(40, 6)];

13. NSShadowAttributeName

NSShadow *shadow = [[NSShadow alloc]init];
shadow.shadowOffset = CGSizeMake(10, 10);
shadow.shadowColor = [UIColor redColor];
[attrString addAttribute:NSShadowAttributeName value:shadow range:NSMakeRange(0, str.length)];
@NSShadowAttributeName

14. NSTextEffectAttributeName

[attrString addAttribute:NSTextEffectAttributeName value:NSTextEffectLetterpressStyle range:NSMakeRange(50, 10)];

15. NSBaselineOffsetAttributeName

[attrString addAttribute:NSBaselineOffsetAttributeName value:@1 range:NSMakeRange(10, 10)];

16. NSObliquenessAttributeName

[attrString addAttribute:NSObliquenessAttributeName value:@0.5 range:NSMakeRange(10, 20)];

17. NSExpansionAttributeName

[attrString addAttribute:NSExpansionAttributeName value:@1.0 range:NSMakeRange(10, 10)];

18. NSWritingDirectionAttributeName

[attrString addAttribute:NSWritingDirectionAttributeName value:@[@2] range:NSMakeRange(10, 10)];

19. NSVerticalGlyphFormAttributeName

[mAttStr addAttribute:NSVerticalGlyphFormAttributeName value:@0 range:NSMakeRange(10, 10)];

20. NSLinkAttributeName

/**
 * 此属性的值是NSURL对象(首选)或一个NSString对象。此属性的默认值为nil,表示没有链接。
 * UILabel无法使用该属性, 可以使用UITextView 控件.
 */
    UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(50, 50, 50, 50)];
    [self.view addSubview:textView];
    textView.backgroundColor  = [UIColor redColor];
    
    
    NSString *strLink = @"百度链接";
    NSAttributedString *attStrUrl  = [[NSAttributedString alloc] initWithString:strLink attributes:@{NSLinkAttributeName: [NSURL URLWithString:@"http://www.baidu.com"]}];
    
    textView.editable = NO;
    
    /* 签订协议, 指定代理人之后. 但点击链接时, 会回调协议方法 (- textView:shouldInteractWithURL:inRange:) */
    textView.delegate = self;
    
    textView.attributedText = attStr;
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {
    
    NSLog(@"%s", __FUNCTION__);
    NSLog(@"url: %@", URL);
    return YES;
}

21. NSAttachmentAttributeName

/* 这个属性的值是一个NSTextAttachment对象。此属性的默认值为nil,表示无附件。*/
    
    /**
     * 关于NSTextAttachment类的简单说明
     *
     * NSTextAttachment 类有一个指定的初始化方法(- initWithData:ofType:), 需要指定附件文档的数据和附件文件的类型. 如果附件文档数据指定nil, 那么系统将会默认指定为image对象作为值. 因此, 也可以通过这个特性实现图文混排.
     * 下面就以附件为image对象来说明NSAttachmentAttributeName的使用.
     *
     */
    
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50, 50, 50, 50)];
    label.backgroundColor = [UIColor redColor];
    [self.view addSubview:label];
    
    
    /* 下面实现在百度两个汉字之间插入一个照片 */
    NSString *stiAtt = @"百度";
    
    NSTextAttachment *attach = [[NSTextAttachment alloc] initWithData:nil ofType:nil];
    attach.bounds = CGRectMake(0, 0, 50, 50);
    attach.image = [UIImage imageNamed:@"taobao.jpg"];
    
    NSAttributedString *strAtt = [NSAttributedString attributedStringWithAttachment:attach];
    
    NSMutableAttributedString *strMatt = [[NSMutableAttributedString alloc] initWithString:stiAtt];
    
    [strMatt insertAttributedString:strAtt atIndex:1];
    
    label.attributedText = strMatt;
    
    self.titleLabel.attributedText = mAttStr;
    [self.titleLabel sizeToFit];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,248评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,681评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,443评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,475评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,458评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,185评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,451评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,112评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,609评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,083评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,163评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,803评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,357评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,357评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,590评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,636评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,925评论 2 344

推荐阅读更多精彩内容