UIView bringSubviewToFront: *nicht* bringen, Blick nach vorne
Ich bin die Implementierung einer einfachen iOS-Solitär-Spiel, das ermöglicht dem Benutzer, um die Karten zu ziehen um in der üblichen Weise. Die Karten sind vertreten mit dem UIView
Unterklasse CardView
. Die Karte Ansicht sind Geschwister, die Untersichten der SolitaireView
. Der folgende Abschnitt versucht, "bringe eine Karte an die front", so dass es über alle anderen Ansichten als er gezogen wird:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
if (touch.view.tag == CARD_TAG) {
CardView *cardView = (CardView*) touch.view;
...
[self bringSubviewToFront:cardView];
...
}
}
Leider, die Karte ist z-Reihenfolge bleibt unverändert, während das ziehen. In den Bildern unten, ich bin das ziehen des Königs. Beachten Sie, wie ist es richtig auf der Oberseite der Neun im linken Bild, aber nicht korrekt unter den Beiden (unter den gesamten stack eigentlich) im rechten Bild:
Ich habe auch versucht, ändern Sie die layer.zPosition
Eigenschaft auch ohne Erfolg.
Wie kann ich die Kartenansicht auf der Vorderseite das beim ziehen? Ich bin verwirrt.
- Ich entdeckte, dass
bringSubviewToFront:
löst die Ansicht 'needsLayout' - flag gesetzt werden. MeinelayoutSubviews
Methode auch aufrufenbringSubviewToFront:
kehren so alle der Ansicht z-Bestellungen wieder in Ihren ursprünglichen Zustand! - Dann, was ist die Lösung dafür? Ich bin auch mit der gleichen Art von Anforderungen, von wo aus der Liste der Karten, wenn ich wählen Sie die Mitte, um Karte, sollte es kommen, dann kommen Sie nach vorne. aber meine animation nicht funktioniert, weil der bringSubviewToFront: Methode
- Wenn Sie den stick mit UIView-Unterklassen, dann müssen Sie markieren Sie die Karte, die gezogen wird, so dass layoutSubviews können es auf die Oberseite. Habe ich eigentlich eingeschaltet, um mit CALayers, wie unten erwähnt.
- Vielen Dank für Ihre Antwort. Kannst du bitte den code für, die.
- Ein code-snippet ist unten aufgeführt.
- Source-code nun im github.com/wcochran/solitaire-iOS
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bestätigt.
bringSubviewToFront:
UrsachenlayoutSubview
aufgerufen werden. Da meine version vonlayoutSubviews
legt die z-Bestellungen auf alle Ansichten, wurde dies zum Verhängnis, die z-Reihenfolge ich die Einstellung wurde in dertouchesBegan:withEvent
code oben. Apple sollte erwähnen, diese Nebenwirkung in denbringSubviewToFront
Dokumentation.Statt mit einem
UIView
Unterklasse erstellte ich einCALayer
Unterklasse namensCardLayer
. Ich Griff die touch in meinemKlondikeView
Unterklasse wie unten aufgeführt. topZPosition ist eine Instanz var, die Spuren der höchste zPosition allen Karten. Beachten Sie, dass die änderung derzPosition
ist in der Regel animierte -- ich dies ausschalten in den folgenden code:UIView
's für die Karten zu spielen, kann ein schlechtes design Wahl-ich glaube nicht, dass Sie wirklich waren für diese bestimmt. Ich denke, ich werde einen Schritt zurück und verwendenCALayer
's statt.