Wie skaliere ich den Übergang UILabel, ohne viel Speicher zu verwenden?

9

Ich versuche, einige der 2D-Übergänge in der Beispielpräsentation von Impress.js in Objective zu reproduzieren C. Speziell das Drehen, Schwenken und Skalieren - im Moment konzentriere ich mich auf die Skalierung.

Ich habe versucht, ein UILabel auf den Punkt zu skalieren, wo es "den Bildschirm passiert", wie das "visualisiere deine großen Gedanken" - & gt; "und winzige Ideen" macht in der Beispielpräsentation.

Das habe ich bisher versucht:

%Vor%

Leider kostet das ca. 30-60 MB RAM, je nachdem, was der contentScaleFactor und die anfängliche Schriftgröße sind. Wenn ich den contentScaleFactor nicht vergrößere, sieht der Text verschwommen aus. Auch die Erhöhung der Schriftgröße scheint genau so viel Speicher zu verbrauchen.

Hier ist, was es im Profiler aussieht:

Und das ist nur ein einziges UILabel.

Gibt es irgendeinen Weg, dies zu tun, ohne so viel Speicher zu verbrauchen, ohne die Qualität des darzustellenden Textes oder der Übergänge zu opfern?

    
Luke 04.03.2013, 20:43
quelle

2 Antworten

4

Projektdownload-Link

Ich glaube nicht, dass es notwendig ist, Quartz zu verlassen, um diese Reproduktion zu erreichen. Alles, was Sie beschrieben haben, und alles, was ich aus Impress.js zusammengetragen habe, scheint replizierbar zu sein, indem Transformationen (meist 2D, einige 3D) auf eine Reihe von UILabels angewendet werden, die zu einer Containeransicht hinzugefügt werden Hauptansicht.

Dazu verwendet das Projekt, das ich erstellt habe, eine Unterklasse von UILabel mit dem Titel "ImpressLabel" mit einer zusätzlichen Init-Funktion. Statt der Bezeichnung ein Rahmen zu übergeben, übergeben Sie ihm eine Größe, einen Mittelpunkt und ein CGFloat für die Drehung des Etiketts auf der Z-Achse. Diese Transformation wird bei der Instanziierung auf das Label angewendet, sodass sie beim Einrichten der Labels bereits auf der Bildschirmposition und in der von Ihnen angegebenen Position angezeigt wird.

Dann können Sie, solange der Text konfiguriert ist, die Bezeichnung an ein NSAttributedString anstatt an ein NSString übergeben. Dadurch können Sie verschiedene Teile des Strings unabhängig voneinander ändern, so dass verschiedene Wörter im Label unterschiedliche Größen, Schriftarten, Farben, Hintergrundfarben usw. haben können. Hier ein Beispiel für die obigen zwei Absätze:

%Vor%

Nun zu mehr Eingeweiden der ganzen Operation. Wie ich oben erwähnt habe, fügt diese Unterklasse jedem Label eine Tippgeste hinzu. Wenn ein Tippen erkannt wird, passieren ein paar Dinge. Die Ansicht mit den Beschriftungen wird durch Anpassen der Skalierung verschoben / zurück / entfernt. Es wird auch beginnen, zu rotieren und seinen Ankerpunkt in der Hauptansicht so anzupassen, dass die ausgewählte Beschriftung auf dem Bildschirm in der richtigen Ausrichtung zentriert wird, wenn die Animation stoppt. Dann, während dies alles läuft, wird das Alpha des ausgewählten Labels auf 1,0 f angehoben, während das Alpha des Rests auf 0,25 f gesenkt wird.

%Vor%

Nun, um einige der in Ihrer Frage aufgeführten Probleme anzugehen.

  1. Ich habe dieses Projekt im Tool für die Zuteilung von Instrumenten und es profiliert verbraucht insgesamt nur etwa 3,2 MB, also würde ich sagen, dass dies der Fall ist effizient genug.

  2. Das von mir zur Verfügung gestellte Beispiel animiert die meisten Objekte im 2D-Raum, mit Ausnahme der Skalierungsanimation, die bestenfalls eine Illusion ist. Was ich hier gemacht habe, soll als ein Beispiel dafür dienen, wie das gemacht werden kann und ist keine 100% vollständige Demonstration, weil, wie ich oben erwähnte, Animation wirklich nicht mein Fachgebiet ist. Wenn man jedoch über die Dokumente blickt, scheint es der Schlüssel zu sein, ein Etikett in der dritten Dimension rotieren zu lassen und seine Superansicht anzupassen, um alle Etiketten zu drehen und das ausgewählte Etikett flach zu lassen, wäre die Verwendung von CATransform3DInvert() . Obwohl ich noch keine Zeit hatte, um herauszufinden, ob es funktioniert, scheint es genau das zu sein, was in diesem Szenario benötigt wird.

  3. Was die Spiegelung angeht, glaube ich nicht, dass es Probleme geben wird, alles richtig zu skalieren. Blick auf Apples Multiple Display Programming Guide , es sieht so aus, als wäre das an die NSNotification UIScreenDidConnectNotification übergebene Objekt ein UIScreen Objekt. Da dies der Fall ist, können Sie leicht nach diesen Anzeigengrenzen fragen und die Rahmen der Beschriftungen und der Containeransicht entsprechend anpassen.

Hinweis: In diesem Beispiel transformieren nur 0, 90, 180 und -90 Grad 100% korrekt, weil die Koordinaten des Ankerpunkts falsch generiert werden. Es sieht so aus, als ob die Lösung bei CGPointApplyAffineTransform(<#CGPoint point#>, <#CGAffineTransform t#>) liegt, aber ich hatte noch nicht so viel Zeit damit zu spielen, wie ich es mir gewünscht hätte. In jedem Fall sollte dies ausreichen, um mit Ihrer Reproduktion zu beginnen.

Dies hat definitiv mein Interesse geweckt, und wenn ich die Möglichkeit habe, noch einmal daran zu arbeiten, werde ich diesen Beitrag gerne mit neuen Informationen aktualisieren. Hoffe das hilft!

    
Mick MacCallum 11.03.2013, 20:53
quelle
1

Ich denke, es würde helfen, wenn Sie den Text auf einem CALayer zeichnen. Eine Bibliothek, die dabei helfen könnte, ist: Ссылка Zeichne den nächsten Schritt deiner Animation auf einen neuen CALayer und transformiere ihn in diesen. Sie können die erforderlichen Animationen über diese Bibliothek verketten: Ссылка oder diese Bibliothek: Ссылка

    
Edwin Vermeer 11.03.2013 07:09
quelle