2015-07-11 48 views
13

WWDC 2013的會話220(高級文本佈局和與文本工具包的效果)中,他們專門說NSLayoutManager可以與NSTextStorageNSTextContainer一起使用來創建高級文本動畫。他們沒有說如何。使用NSLayoutManager創建動畫文字效果?

我想使用NSLayoutManager/NSTextStorage/NSTextContainer來創建自定義文本動畫。簡而言之,我想要製作各個字形的大小和位置,並淡化和忽略特定的字形。

似乎沒有專門的方法和文件的動畫與NSLayoutManager和唯一的教程,我發現is here。但是,它展示瞭如何將NSLayoutManager轉換爲動畫,而不是如何使用(它們爲每個單獨的字形創建CATextLayer!)。

有人可以指向正確的方向嗎?我知道如何使用NSLayoutManager/NSTextStorage/NSTextContainer來呈現靜態文本。一些演示,顯示NSLayoutManager動畫文本的原理將是完美的。爲了讓我開始,我可以自己弄清細節。

+1

您是否找到更多信息在這個? – dannyzlo

+0

@DannyZlobinsky不是。從高聲譽的用戶那裏得到了答案,但是卻被刪除了(?!)。我仍然在等待一些好的答案。 – drasto

+2

這裏有一個很好的視頻教程,其中顯示了NSTextStorage原則。我希望它能幫助你,但它看起來很有趣: https://www.youtube.com/watch?v=y7trOFDGVwA – juanmajmjr

回答

0

NSTextContainer、NSLayoutManager、NSTextStorage是新的iOS7:

1)NSTextContainer:

的NSTextContainer類定義,其中文本被佈置的區域。 NSTextContainer對象定義了矩形區域,您可以在textcontainer的boundingrectangle中定義排除路徑,並在排除的殘留文件流中定義排除路徑。

2)NSLayoutManager:

一種NSLayoutManager物體座標在NSTextStorage對象保持的字符的佈局和顯示。它將Unicode字符代碼映射爲字形,將字形設置爲一系列NSTextContainer對象,並將它們顯示在一系列文本視圖對象中。

3)NSTextStorage:

NSTextStorage是NSMutableAttributedString的semiconcrete類,用於管理一組客戶NSLayoutManagerobjects,notifyingthemofanychangestoitscharactersorattributessothattheycanrelay的,並根據需要重新顯示的文本。

我們可以知道NSTextStorage可以存儲和管理UITextView的文本,它是NSMutableAttributedString的subclass.We可以添加或修改屬性,所以它是一個不錯的選擇,存儲和管理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]; 

首先是使他們的情況下,創造thier relationship.You必須initWithFrame:textContainer:方法UITextView添加NSTextContainer

// 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];