2015-07-11 37 views
13

In Sitzung 220 (Erweiterte Textlayouts und Effekte mit Textkit) von WWDC 2013 sie speziell NSLayoutManager können in Verbindung mit und NSTextContainer verwendet werden, um erweiterte Textanimationen zu erstellen. Sie sagen nicht wie.Erstellen von animierten Texteffekten mit NSLayoutManager?

Ich möchte NSLayoutManager/NSTextStorage/NSTextContainer verwenden, um benutzerdefinierte Textanimation zu erstellen. Um es einfach auszudrücken, möchte ich die Größe und Position einzelner Glyphen animieren und bestimmte Glyphen verblassen und verschwinden lassen.

Es scheint keine dedizierten Methoden noch Dokumentation für Animationen mit NSLayoutManager und das einzige Tutorial zu der Frage, die ich gefunden is here. Es zeigt jedoch, wie man NSLayoutManager in Animationen hacken kann, anstatt so zu verwenden, wie es verwendet werden soll (sie erzeugen CATextLayer für jedes einzelne Zeichen!).

Kann mir jemand in die richtige Richtung zeigen? Ich weiß, wie man NSLayoutManager/NSTextStorage/NSTextContainer benutzt, um statischen Text zu übertragen. Eine Demo, die die Prinzipien des Animierens von Text mit NSLayoutManager zeigt, wäre perfekt. Nur um mich zu starten, kann ich selbst Details herausfinden.

+1

Haben Sie weitere Informationen gefunden? dazu? – dannyzlo

+0

@DannyZlobinsky Nicht wirklich. Es gab eine Antwort von hoher Reputation Benutzer, aber aparently wurde gelöscht (?!). Ich warte immer noch auf gute Antworten. – drasto

+2

Hier ein gutes Video-Tutorial, wo NSTextStorage Prinzipien zeigt. Ich hoffe, es könnte dir etwas helfen, das da ist, aber es sieht interessant aus: https://www.youtube.com/watch?v=y7trOFDGVwA – juanmajmjr

Antwort

0

NSTextContainer、NSLayoutManager、NSTextStorage ist neu für iOS7:

1) NSTextContainer:

Die NSTextContainer Klasse definiert einen Bereich, in dem Text ausgelegt. Ein NSTextContainer-Objekt definiert rechteckige Bereiche, und Sie können Ausschlusspfade innerhalb der umschließenden Rechtecke des Textcontainers definieren, um die Textflüsse um den ausgeschlossenen Bereich herum zu verbergen.

2) NSLayoutManager:

Ein NSLayoutManager Objektkoordinaten, das Layout und die Anzeige von in einem Objekt gehalten NSTextStorage Zeichen. Es ordnet Unicode-Zeichencodes Glyphen zu, legt die Glyphen in einer Reihe von NSTextContainer-Objekten fest und zeigt sie in einer Reihe von Textansichtsobjekten an.

3) NSTextStorage:

NSTextStorage ist eine Unterklasse von semiconcrete NSMutableAttributedString, die einen Satz von Client-NSLayoutManagerobjects, notifyingthemofanychangestoitscharactersorattributessothattheycanrelay und erneut anzuzeigen, den Text schafft je nach Bedarf.

Wir könnten wissen NSTextStorage speichern und verwalten UITextView ‚s Text, und es ist NSMutableAttributedString‘ s subclass.We kann die Attribute hinzufügen oder ändern, so dass es eine gute Wahl UITextView ‚s Text zu speichern und zu verwalten.

NSLayoutManager verwenden Sie für den Inhalt von NSTextStorage Layout verwalten.

NSTextContainer Geben Sie ein Rechteck zum Speichern des Layouttexts ein.

Wir können sie einfach nutzen:

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

Erstens ist Instanz von ihnen machen, und erstellen thier relationship.You NSTextContainer in UITextView von initWithFrame:textContainer: Methode hinzufügen.

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

Wenn UITextStorage verwenden möchten Text Attribute zu ändern, können Sie verwenden:

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

Zwischen ihnen können Sie Text bearbeiten, wie zB:

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

oder die Farbe ändern:

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