2 Stimmen

Ändern der z-Reihenfolge von Unteransichten auf dem iPhone

Ich entwickle ein Spiel. Ich verwende etwa 150 UIImageView, um die Grafiken zu halten. Ich simuliere eine 3D-Umgebung, so möchte ich die z-Reihenfolge ändern (wie nah ist ein Objekt an der Kamera).

Ich weiß, dass es sie gibt: [superWindow exchangeSubviewAtIndex:i withSubviewAtIndex:j];

Aber aus irgendeinem Grund funktioniert es nicht, einige der Unteransichten verschwinden und tauchen wieder auf.

Jetzt entferne ich einfach alle Unteransichten und füge sie in der richtigen Z-Reihenfolge wieder hinzu, das ist ok mit 50 Unteransichten (auf einem 2G iphone), aber mit 120 dauert es eine halbe Sekunde, so dass das Gameplay nervt (ich habe kein 3GS, also habe ich es nicht versucht).

Ich verwende so viele Unteransichten, weil jede ein Quadrat ist, dann färbe ich sie ein, verändere ihre Größe und verschiebe sie irgendwo auf dem Bildschirm. Ich halte die Unteransichten unter einem NSMutableArray...

5voto

Timothy Walters Punkte 16633

In der iPhone-Dokumentation wird häufig vor mehreren verschachtelten UIViews gewarnt, da dies ab einem bestimmten Punkt zu einem großen Leistungsverlust führt. Wenn Sie anfangen, Probleme zu bekommen, ist eine Möglichkeit, Ihre UIViews in ein Bild zu rendern und damit die Anzahl der Ansichten auf dem Bildschirm zu verringern, aber wenn Sie 3D simulieren, ist das wahrscheinlich nicht viel helfen, da Ihre zusammengesetzte Ansicht zu oft neu gerendert werden müsste.

Das iPhone bietet volle Unterstützung für OpenGL ES, was eine real 3D-Umgebung. Schauen Sie sich einige Beispiele und/oder ein gutes Buch zu diesem Thema an und Sie werden feststellen, dass es viel einfacher ist, einfach OpenGL zu verwenden.

4voto

SNick Punkte 41

Die Z-Reihenfolge ist ein Artefakt der Position, an der Ihre Ansicht in der Liste der Unteransichten Ihrer Hauptansicht erscheint. Die zuletzt zur Hauptansicht hinzugefügte Unteransicht steht "ganz oben".

Um also eine Ansicht nach "oben" zu verschieben, entfernen Sie sie aus der übergeordneten Ansicht und fügen sie dann wieder hinzu, so dass sie die letzte und somit die oberste ist.

Hier bewegt sich eine Ansicht selbst an die Spitze der Z-Reihenfolge.

// move to the to in the z-order
UIView* superview = [self superview];
[self retain];
[self removeFromSuperview];
[superview addSubview:self];
[self release];

Beachten Sie das [self retain], um Ihr Dealloc zu verhindern, wenn Ihre Superview die einzige Referenz auf Sie ist.

2voto

Brad Larson Punkte 169275

Wenn Sie nicht den Sprung zu OpenGL ES wagen wollen, wie Timothy vorschlägt, können Sie die UIViews durch CALayers ersetzen und sie innerhalb einer CATransformLayer . CATransformLayer ist neu in iPhone OS 3.0 und ermöglicht ein echtes 3-D-Layout der CALayers. Sie können dann die zPosition Eigenschaft auf Ihren CALayern, um sie in der Z-Ebene des CATransformLayers zu platzieren. Für weitere Informationen zum 3D-Layout von CALayers verweise ich auf dieser Artikel .

Sie können sogar einen schönen perspektivischen Effekt auf den gesamten CATransformLayer anwenden, indem Sie Einstellung des Elements m34 in der auf diese Ebene angewendeten CATransform3D.

Der Wechsel von UIViews zu CALayers ist ziemlich einfach, da ihre Strukturen viele Gemeinsamkeiten aufweisen.

1voto

Erwägen Sie die Verwendung einer 2D-Spielbibliothek wie Cocos2D . Ich bin ziemlich sicher, dass unterstützt Z-Ordering, und die Leistung wird erheblich besser als mit UIViews sein.

1voto

ja41 Punkte 171

Ich weiß, dies ist alt, aber Sie können die z-Reihenfolge mit bringSubViewToFront ändern.

Siehe diese Antwort: Wie stellt man den iPhone UI View z Index ein?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X