我最近决定解决我遇到的问题的最佳方法是使用 NSAttributedString 实例。至少对于新手来说,文档似乎缺乏。关于stackoverflow的答案主要有两种:
- 阅读文档
- 使用 AliSoftware 最优秀的OHAttributedLabel类。
我真的很喜欢第二个答案。但是我想更好地理解 NSAttributedString,所以我在这里提供了最小的 (?) 组装和显示属性字符串的示例,以防它帮助其他人。
我使用 Storyboards 和 ARC 在 Xcode (4.5.2) 中为 iPad 创建了一个新的单窗口项目。
AppDelegate 没有变化。
我创建了一个基于 UIView 的新类,称之为 AttributedStringView。对于这个简单的示例,最简单的方法是使用 drawAtPoint: 方法将属性字符串放在屏幕上,这需要有效的图形上下文,并且在 UIView 子类的 drawRect: 方法中最容易获得。
这是完整的 ViewController.m (没有对头文件进行任何更改):
#import "ViewController.h"
#import "AttributedStringView.h"
@interface ViewController ()
@property (strong, nonatomic) AttributedStringView *asView;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self.view addSubview:self.asView];
}
- (AttributedStringView *)asView
{
if ( ! _asView ) {
_asView = [[AttributedStringView alloc] initWithFrame:CGRectMake(10, 100, 748, 500)];
[_asView setBackgroundColor:[UIColor yellowColor]]; // for visual assistance
}
return _asView;
}
@end
这里是完整的 AttributedStringView.m(没有对头文件进行任何更改):
#import "AttributedStringView.h"
@interface AttributedStringView ()
@property (strong, nonatomic) NSMutableAttributedString *as;
@end
@implementation AttributedStringView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
NSString *text = @"A game of Pinochle is about to start.";
// 0123456789012345678901234567890123456
// 0 1 2 3
_as = [[NSMutableAttributedString alloc] initWithString:text];
[self.as addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:36] range:NSMakeRange(0, 10)];
[self.as addAttribute:NSFontAttributeName value:[UIFont italicSystemFontOfSize:36] range:NSMakeRange(10, 8)];
[self.as addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:36] range:NSMakeRange(18, 19)];
if ([self.as size].width > frame.size.width) {
NSLog(@"Your rectangle isn't big enough.");
// You might want to reduce the font size, or wrap the text or increase the frame or.....
}
}
return self;
}
- (void)drawRect:(CGRect)rect
{
[self.as drawAtPoint:CGPointMake(0, 100)];
}
@end