2015-07-11 20 views
13

W sesji 220 (Advanced układów tekst i efekty z zestawem słowny) WWDC 2013 one konkretnie powiedzieć NSLayoutManager może być stosowany w połączeniu z NSTextStorage i NSTextContainer do tworzenia zaawansowanych animacji tekstowych. Nie mówią jak.Tworzenie animowanych efektów tekstowych przy użyciu menedżera NSLayoutManager?

Chcę użyć NSLayoutManager/NSTextStorage/NSTextContainer, aby utworzyć niestandardową animację tekstu. Mówiąc prościej, chcę animować rozmiar i położenie poszczególnych glifów oraz zanikać i odfiltrowywać określone glify.

Wygląda na to, że nie istnieją żadne dedykowane metody ani dokumentacja animacji z NSLayoutManager i jedyny samouczek dotyczący sprawy, którą znalazłem is here. Jednak pokazuje, jak zhakować NSLayoutManager w animacje, a nie jak używać go w sposób, w jaki ma być używany (tworzą CATextLayer dla każdego pojedynczego glifu!).

Czy ktoś może wskazać mi właściwy kierunek? Wiem, jak używać NSLayoutManager/NSTextStorage/NSTextContainer do renderowania tekstu statycznego. Niektóre demo, pokazujące zasady animacji tekstu z NSLayoutManager byłoby idealne. Tylko po to, abym mógł zacząć, sam mogę wymyślić szczegóły.

+1

Znalazłeś więcej informacji w tej sprawie? – dannyzlo

+0

@DannyZlobinsky Niezupełnie. Otrzymano odpowiedź od użytkownika o wysokiej reputacji, ale został usunięty (?!). Wciąż czekam na dobre odpowiedzi. – drasto

+2

Oto dobry film instruktażowy, w którym przedstawiono zasady NSTextStorage. Mam nadzieję, że może ci pomóc coś, co tam jest, ale wygląda ciekawie: https://www.youtube.com/watch?v=y7trOFDGVwA – juanmajmjr

Odpowiedz

0

NSTextContainer、NSLayoutManager、NSTextStorage jest nowy iOS7:

1) NSTextContainer:

klasie NSTextContainer definiuje region, w którym tekst jest rozplanowany. Obiekt NSTextContainer definiuje rejony prostokątne i można zdefiniować ścieżki wykluczeń wewnątrz linii tekstowej textcontainer rectanglesothattextsdalej na ścieżce do wykluczeńzasilania.

2) NSLayoutManager:

NSLayoutManager obiekt koordynuje układ i wyświetlanie znaków przechowywanych w obiekcie NSTextStorage. Mapuje kody znaków Unicode na glify, ustawia glify w serii obiektów NSTextContainer i wyświetla je w serii obiektów widoku tekstowego.

3) NSTextStorage:

NSTextStorage jest semiconcrete podklasa NSMutableAttributedString który zarządza zestaw NSLayoutManagerobjects klienta, notifyingthemofanychangestoitscharactersorattributessothattheycanrelay i ponownie wyświetlić tekst w razie potrzeby.

Mogliśmy wiedzieć NSTextStorage można przechowywać i zarządzać UITextView „s tekst, a to jest NSMutableAttributedString” s subclass.We można dodać lub zmodyfikować atrybuty, więc jest to dobry wybór, aby przechowywać i zarządzać UITextView „s tekst.

NSLayoutManager służy do zarządzania zawartością układu NSTextStorage.

NSTextContainer zapewniają prostokąt do przechowywania tekstu w układzie.

Możemy po prostu z nich korzystać:

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

Po pierwsze to zrobić wystąpienie z nich, a także tworzyć thier relationship.You należy dodać NSTextContainer w UITextView przez initWithFrame:textContainer: metody.

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

Jeśli chcesz użyć UITextStorage zmienić atrybuty tekstu, można użyć:

[_textStorage beginEditing]; // begin edit 
[_textStorage endEditing]; // end edit 

między nimi można edytować tekst, takie jak:

[_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]; 

lub zmieniać kolor:

[_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];