富文本的基本数据类型是NSAttributedString。**属性化字符串**(attributed string)是把属性设置到某些字符上的字符串。属性可以是任何键值对,但是为了实现富文本,则通常会包含样式信息,比如字体、颜色和缩进。

通常使用NSMutableAttributedString更好,这样我们就可以修改字符串各部分的属性。NSAttributedString则需要字符串的属性保持不变。

下面的例子将创建一个基本的矩形布局来在UITextView中显示一些富文本。相应的工程可以在名为RichText的示例代码中找到。首先,在Interface Builder中添加一个UITextView并且把模式选择为Attributed;然后,创建一个NSAttributedString并设置一些属性。在本例中,我们会创建一个字符串,然后对整个字符串设置字体属性。

ViewController.m(RichText)

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    const CGFloat fontSize = 16.0;

    // 创建基本字符串。
// 注意如何定义一个多行的字符串
NSString *string =
@"Here is some simple text that includes bold and italics.n"
@"n"
@"We can even include some color."; // 创建可变属性化字符串
NSMutableAttributedString *attrString =
[[NSMutableAttributedString alloc] initWithString:string]; NSUInteger length = [string length]; // 设置基本字体
UIFont *baseFont = [UIFont systemFontOfSize:fontSize];
[attrString addAttribute:NSFontAttributeName value:baseFont
range:NSMakeRange(0, length)];

正如26.2.1节所讨论的那样,要设置粗体,需要设置不同的字体。对于系统字体来说这很简单,因为请求系统字体的粗体很容易:

1
2
3
4
    //用系统字体的粗体来设置粗体,搜索单词"bold"
UIFont *boldFont = [UIFont boldSystemFontOfSize:fontSize];
[attrString addAttribute:NSFontAttributeName value:boldFont
range:[string rangeOfString:@"bold"]];

但是如果你用的是非系统字体,而又需要粗体或斜体变体呢?不幸的是,UIKit没有很好的办法确定字体的变体,但是Core Text有。链接了CoreText.framework以后就可以用下面的函数了。该函数用UIFont的名字来找到正确的CTFont,然后用CTFontCreateCopyWithSymbolicTraits来添加所请求的变体(比如kCTFontTraitItalic),最后用得到的字体名称来创建正确的UIFont。但愿将来新版本的iOS能让这个过程变得容易一些。

 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
    UIFont * GetVariationOfFontWithTrait(UIFont *baseFont,
CTFontSymbolicTraits trait) {
CGFloat fontSize = [baseFont pointSize]; CFStringRef baseFontName = (__bridge CFStringRef)[baseFont fontName];
CTFontRef baseCTFont = CTFontCreateWithName(baseFontName,
fontSize, NULL);
CTFontRef ctFont =
CTFontCreateCopyWithSymbolicTraits(baseCTFont, 0, NULL,
trait, trait); NSString *variantFontName =
CFBridgingRelease(CTFontCopyName(ctFont,
kCTFontPostScriptNameKey)); UIFont *variantFont = [UIFont fontWithName:variantFontName
size:fontSize]; CFRelease(ctFont);
CFRelease(baseCTFont); return variantFont;
}
...
UIFont *italicFont = GetVariationOfFontWithTrait(baseFont,
kCTFontTraitItalic);
[attrString addAttribute:NSFontAttributeName value:italicFont
range:[string rangeOfString:@"italics"]];

最后,添加合适的属性来加上颜色:

1
2
3
4
5
    // 设置颜色
UIColor *color = [UIColor redColor];
[attrString addAttribute:NSForegroundColorAttributeName
value:color
range:[string rangeOfString:@"color"]];

注意这里用了addAttribute:value:range:而不是setAttribute:value:range。这样可以把新属性和已有的属性合并,通常是我们所期望的结果。

设置好所有属性之后,可以给UITextView设置attributedText属性来显示这个字符串:

1
    self.textView.attributedText = attrString;

大部分具有text属性的控件现在也会有attributedText属性,这样转换已有的代码会容易得多。

有一点很重要,NSAttributedString不是NSString的子类。它包含了一个NSString对象。类似地,NSMutableAttributedString包含了一个NSMutableString对象。尽管属性化字符串也有常用的字符串方法(如length),但通常还得用stringmutalbeString来获取底层的字符串。

(转)iOS 属性字符串的更多相关文章

  1. iOS UILable和属性字符串的使用

    UILable的常用方法和属性 设置文字颜色(默认为黑色) @property(nonatomic,strong) UIColor     *textColor 设置显示文字 @property(no ...

  2. iOS依据字符串计算UITextView高度

    iOS计算字符串高度,有须要的朋友能够參考下. 方法一:ios7.0之前适用 /** @method 获取指定宽度width,字体大小fontSize,字符串value的高度 @param value ...

  3. 属性字符串(NSAttributedString)的简单应用

    属性字符串NSAttributedString 可以对字符串附加格式信息,由于对于对不同文本片段使用不同的格式,属性字符串类特别合适. IOS 6中对样式文本有了大改善,大部分主要的UIKit控件都允 ...

  4. 属性字符串的replaceCharactersInRange方法

    一,实验: 1> 让 range 的 length 参数为0,以下代码输出属性字符串的结果为12354 NSMutableAttributedString *attrStr = [[NSMuta ...

  5. NSMutableAttributedString可变属性字符串的用法

    适用于:当你想对一个字符串中的某几个字符更改颜色,字体... NSString *string = @"今日营养配餐提供热量1800千卡,需要饮食之外额外补充钙10mg,铁20mg,锌9.5 ...

  6. 有两个地方,用到了javabean对象和属性字符串值之间的转换

    1.有两个地方,用到了javabean对象和属性字符串值之间的转换 2.一个是接入层spring mvc,将json字符串参数转换为javaBean.通过@RequestBody javaBean方式 ...

  7. IOS NS 字符串 数组 字典 文件 动态 静态 操作

    ios 常用字符串的操作   //将NSData转化为NSString        NSString* str = [[NSString alloc] initWithData:response e ...

  8. iOS: 属性列表介绍 Introduction to Property Lists

    iOS: 属性列表介绍 Introduction to Property Lists 从本质上说, 属性列表就是苹果的对象数据序列化与反序列化方式 属性列表使用几种数据类型把数据组织为键值表和值表 P ...

  9. iOS 获取字符串中的单个字符

    要取到单个字符,就要知道字符串的编码方式,这样才能够定位每个字符在内存中的位置.但是,iOS的字符串编码是不固定的,因此,需要设置一个统一的编码格式,将所有其他格式的字符串都转化为统一的格式,然后就可 ...

随机推荐

  1. Flask (四) 模型进阶

    模型进阶 多对多关联 用户收藏电影,一个用户可以收藏多部电影, 一部电影可以被不同的用户收藏, 是一个多对多关系. ​ # 中间表(不是模型) collects = db.Table('collect ...

  2. Ubuntu 18.10 使用VMware克隆后,克隆后的机器再手动更改interfaces配置文件后无法启动网络的解决办法

    克隆过程就略过了 配置interfaces root@client02:~# vim /etc/network/interfaces # interfaces() ) and ifdown() aut ...

  3. JDK原子类操作

    JDK原子类操作及原理 在JDK5之后,JDK提供了对变量的原子类操作, java.util.concurrent.atomic里都是原子类 原子类的分类 原子更新基本类型 原子更新数组 原子更新抽象 ...

  4. oracle 直接连接到数据库 CMD窗口

    打开cmd 在命令行 中输入如下命令  sqlplus sys/zd****!@60.**.203/orcl as sysdba  就直接连上了

  5. ASP.NET Cookie的登录验证

    做用户登录,我一直用form验证的方式.有时候,为了节省时间,用户希望用户名输入框能够记住用户名,省得下次重新输入.这个时候光用form验证是不行的,因为form验证的话,用户一退出系统就失效了,所以 ...

  6. tomcat启动时自动运行代码

    原文链接:http://jingpin.jikexueyuan.com/article/49660.html 作者: 一直向北 发布时间:2015-07-13 11:12:13 方法1:tomcat ...

  7. spring mvc添加静态资源访问时@Controller无效的解决

    web.xml中的url-pattern设置为/,添加mvc:resources访问静态资源时,@Controller无效的问题 web.xml: <servlet> <servle ...

  8. 倒计时器 CountDownTimer

    使用介绍 开发中经常会遇到一些和倒计时有关的场景,比如发送验证码的按钮,会在点击发送后,显示倒计时间,倒计时结束后才能够刷新按钮,再次允许点击.为了不阻塞软件的运行,又要实时刷新界面,我们通常会用到 ...

  9. vba 时间

    Sub tt1() Dim d1, d2 As Date d1 = #//# d2 = #//# Debug.Print "相隔" & (d2 - d1) & &q ...

  10. jquery最常用的几个方法。——可删除

    jquery使用手册:http://www.eduyo.com/doc/jquery/cheatsheet.html $(this).hasClass("input_money") ...