NSTextContainer、NSLayoutManager、NSTextStorage
是iOS7的新手:
1)NSTextContainer:
NSTextContainer 类定义了一个放置文本的区域。NSTextContainer 对象定义矩形区域,您可以在文本容器的边界矩形内定义排除路径,以便文本在排除路径周围流动。
2)NSLayoutManager:
NSLayoutManager 对象协调保存在 NSTextStorage 对象中的字符的布局和显示。它将 Unicode 字符代码映射到字形,在一系列 NSTextContainer 对象中设置字形,并在一系列文本视图对象中显示它们。
3)NSTextStorage:
NSTextStorage 是 NSMutableAttributedString 的半具体子类,它管理一组客户端 NSLayoutManager 对象,通知他们对其字符或属性的任何更改,以便他们可以根据需要中继和重新显示文本。
我们知道NSTextStorage
可以存储和管理UITextView
的文本,它是NSMutableAttributedString
的子类。我们可以添加或修改属性,所以存储和管理UITextView
的文本是一个不错的选择。
NSLayoutManager
用于管理NSTextStorage
布局的内容。
NSTextContainer
提供一个矩形来存放布局的文本。
我们可以简单地使用它们:
CGRect textViewRect = CGRectInset(self.view.bounds, 10.0, 20.0);
// NSTextContainer
NSTextContainer *container = [[NSTextContainer alloc] initWithSize:CGSizeMake(textViewRect.size.width, CGFLOAT_MAX)]; // new in iOS 7.0
container.widthTracksTextView = YES; // Controls whether the receiveradjusts the width of its bounding rectangle when its text view is resized
// NSLayoutManager
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; // new in iOS 7.0
[layoutManager addTextContainer:container];
// NSTextStorage subclass
self.textStorage = [[TextStorage alloc] init]; // new in iOS 7.0
[self.textStorage addLayoutManager:layoutManager];
首先是创建它们的实例,并创建它们的关系。您必须通过方法添加NSTextContainer
。UITextView
initWithFrame:textContainer:
// UITextView
UITextView *newTextView = [[UITextView alloc] initWithFrame:textViewRect textContainer:container];
newTextView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
newTextView.scrollEnabled = YES;
newTextView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
// newTextView.editable = NO;
newTextView.font = [UIFont fontWithName:self.textStorage.fontName size:18.0];
newTextView.dataDetectorTypes = UIDataDetectorTypeAll;
self.textView = newTextView;
[self.view addSubview:self.textView];
如果想用来UITextStorage
改变文本的属性,可以使用:
[_textStorage beginEditing]; // begin edit
[_textStorage endEditing]; // end edit
在它们之间,您可以编辑文本,例如:
[_textStorage beginEditing];
NSDictionary *attrsDic = @{NSTextEffectAttributeName: NSTextEffectLetterpressStyle};
UIKIT_EXTERN NSString *const NSTextEffectAttributeName NS_AVAILABLE_IOS(7_0); // NSString, default nil: no text effect
NSMutableAttributedString *mutableAttrString = [[NSMutableAttributedString alloc] initWithString:@"Letterpress" attributes:attrsDic];
NSAttributedString *appendAttrString = [[NSAttributedString alloc] initWithString:@" Append:Letterpress"];
[mutableAttrString appendAttributedString:appendAttrString];
[_textStorage setAttributedString:mutableAttrString];
[_textStorage endEditing];
或改变颜色:
[_textStorage beginEditing];
/* Dynamic Coloring Text */
self.textStorage.bookItem = [[BookItem alloc] initWithBookName:@"Dynamic Coloring.rtf"];
self.textStorage.tokens = @{@"Alice": @{NSForegroundColorAttributeName: [UIColor redColor]},
@"Rabbit": @{NSForegroundColorAttributeName: [UIColor greenColor]},
DefaultTokenName: @{NSForegroundColorAttributeName: [UIColor blackColor]}
};
[_textStorage setAttributedString:_textStorage.bookItem.content];
[_textStorage endEditing];