2010-12-29 12 views
0

Ich habe eine iPad-App, die ziehbare UIViews in einem größeren übergeordneten UIView enthalten (die ich die Hauptansicht nennen). Eine der Funktionen der App ist die Möglichkeit, zwischen zwei Ansichten zu ziehen, um sie zu verbinden. Beim Ziehen rendere ich eine Linie in einem CALayer, der in der Ansicht verankert ist, auf die Sie gezogen haben, und endet auf dem Finger des Benutzers. Wenn der Benutzer das Ziehen über einer anderen Ansicht beendet, werden sie angefügt.CALayer Performance-Problem: Animieren einer Linie zwischen zwei UIViews verankert

Wenn Ansichten angehängt sind, wird permanent eine Linie zwischen ihnen gezeichnet.

In der aktuellen Implementierung sind also zwei CALayers Sublayer der Hauptansicht. Einer ist der LinkLayer, der die bestehenden Links zwischen den Sichten rendert. der andere ist der LinkLineLayer, der die Zeile, die der Benutzer gerade zeichnet, mit einer Ziehaktion rendert.

Wenn das Ziehen auftritt und ein neues Ziehereignis eintritt, rufe ich [linkLineLayer setNeedsDisplay] auf. Wenn ein Benutzer eine Ansicht zieht, rufe ich [linkLayer setNeedsDisplay] auf.

die Leistung ist schrecklich auf dem tatsächlichen Gerät, so dass ich rate, dass dies nicht der Weg zu gehen ist. Welche Alternativen gibt es, um Linien zwischen Ansichten (oder Punkten in einer Ansicht) so zu zeichnen, dass ich sie häufig aktualisieren kann, wenn ich eine Ansicht ziehe oder eine Linie zwischen Ansichten ziehe, ohne die Bildrate zu zerstören und die Geräte-CPU zu hämmern?

aktualisieren So letzte i Nacht in ging und zwei Korrekturen vorgenommen, die einen großen Unterschied gemacht: 1.) alle Verbindungslinien Schicht ihre eigenen sind. Wenn eine Ansicht umhergezogen wird, aktualisiere ich nur die Verbindungslinien, die mit dieser spezifischen Ansicht verknüpft sind.
2.) die "Ziehlinie" wurde zu einer Ebene, deren Größe auf die Größe der gerenderten Linie beschränkt ist. Ich passe die Ebenenbegrenzungen an, während sich der Finger des Benutzers bewegt.

Antwort

4

Haben Sie versucht, die Zeilen als CAShapeLayer s zu rendern? Anstatt die Linie selbst zu zeichnen und setNeedsDisplay die ganze Zeit zu rufen, können Sie einfach das path Attribut des CAShapeLayer setzen und es den Rest tun lassen.

Core Animation behandelt CAShapeLayer s anders, und es kann die Zeichnung des Pfades optimieren. Wenn Sie nur einen Pfad in drawLayer:inContext: (oder einem Äquivalent) zeichnen, muss Core Animation die gesamte Ebene als Bild behandeln, da es keine Ahnung hat, was Sie gezeichnet haben. Wenn Sie CAShapeLayer verwenden, kennt Core Animation den Pfad, den Sie im Voraus zeichnen möchten, und kann das Rendering entsprechend optimieren. Sie müssen sich auch nicht um die Größe und Position der Formebene kümmern, da die Ebene nur der Pfad ist.

Auch ein extra Zeiger, wenn Sie einen offenen Pfad (Linie) ohne Füllung zeichnen möchten, müssen Sie die fillColor -Eigenschaft der Formebene auf nil setzen. Wenn Sie dies nicht tun, wird der Pfad automatisch geschlossen und mit einer Standardfarbe gefüllt.

+0

das hat super funktioniert, danke! – aschepis

Verwandte Themen