7

我最近决定解决我遇到的问题的最佳方法是使用 NSAttributedString 实例。至少对于新手来说,文档似乎缺乏。关于stackoverflow的答案主要有两种:

  1. 阅读文档
  2. 使用 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
4

0 回答 0