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];
person
aircraft
schedule
28.12.2016