Подтвердить что ты не робот

Создание анимированных текстовых эффектов с помощью NSLayoutManager?

В сеансе 220 (Расширенные текстовые макеты и эффекты с текстовым комплектом) WWDC 2013 они специально говорят NSLayoutManager можно использовать совместно с NSTextStorage и NSTextContainer для создания расширенной текстовой анимации. Они не говорят, как.

Я хочу использовать NSLayoutManager/NSTextStorage/NSTextContainer для создания пользовательской текстовой анимации. Проще говоря, я хочу одушевить размер и положение отдельных глифов, а также угаснуть и разложить определенные глифы.

Кажется, что нет выделенных методов или документации для анимаций с NSLayoutManager и единственным учебником по этому вопросу, который я нашел здесь. Тем не менее, он показывает, как взломать NSLayoutManager в анимации, а не как использовать его так, как предполагается, чтобы он использовался (они создают CATextLayer для каждого отдельного глифа!).

Может ли кто-нибудь указать мне в правильном направлении? Я знаю, как использовать NSLayoutManager/NSTextStorage/NSTextContainer для визуализации статического текста. Некоторая демонстрация, демонстрирующая принципы анимации текста с NSLayoutManager, была бы идеальной. Только чтобы начать меня, я могу сами выяснить детали.

4b9b3361

Ответ 1

NSTextContainer、NSLayoutManager、NSTextStorage является новым для iOS7:

1) NSTextContainer:

Класс NSTextContainer определяет область, в которой выложен текст. Объект NSTextContainer определяет прямоугольные области, и вы можете определить пути исключения в тексте контейнера, который включает в себя флажок, используемый для перехода в контекст.

2) NSLayoutManager:

Объект NSLayoutManager координирует макет и отображение символов, хранящихся в объекте NSTextStorage. Он отображает коды символов Unicode на глифы, устанавливает глифы в серии объектов NSTextContainer и отображает их в виде нескольких объектов текстового вида.

3) NSTextStorage:

NSTextStorage - это полуконкретный подкласс NSMutableAttributedString, который управляет набором клиентских NSLayoutManagerobjects, уведомляя об этом, и записывает текст по мере необходимости. Повторно отобразите текст по мере необходимости.

Мы могли бы знать, что 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];