2016-01-16 23 views
11

Ich habe eine horizontale Stapelansicht, die ich angeordneten Unteransichten hinzugefügt habe (7 Zellen). Jede der Zellen im Stapel hat eine kreisförmige Markierung, die die Ansichtsgrenzen überschreitet (negative Einschränkung). Beim Ausführen, wie Sie unten sehen können, befindet sich jede Zelle über dem Abzeichen der vorherigen Zelle. Ich möchte die Reihenfolge ändern, damit die Abzeichen vollständig sichtbar sind.Überlappende Ansichten in UIStackView

enter image description here

Versuchte mit dem Z-Index zu spielen, aber es half nicht, wie die Schichten sind irgendwie nicht flach, wie Sie in der folgenden Ansicht Hierarchie sehen:

enter image description here

Jede Idee oder Vorschlag wie es geht?

Danke.

Antwort

7

Die documentation for the UIStackView class sagt, dass:

Die Reihenfolge der Anordnung Subviews die Z-Reihenfolge der Subviews definiert. Wenn sich die Ansichten überschneiden, werden Teilansichten mit einem niedrigeren Index hinter Teilansichten mit einem höheren Index angezeigt.

was ist genau das, was ich in der Frage erlebt habe. Um über meinem speziellen Fall kommen habe ich den Trick von der Semantik der Ansicht zu ändern RTL zu sein, wie hier gesehen Biene:

enter image description here

Dies deckt nicht die einen allgemeinen Fall, weil ein Gerät eingestellt worden sein eine RTL-Sprache in ihren globalen Einstellungen. Für den generischen Fall, denke ich, muss ich die Interface-Semantik überprüfen und eine entgegengesetzte Richtung zu meiner Stack-Ansicht erzwingen.

P.S. Es ist eine Art Hack, also sind alle Ideen willkommen, wie man die Z-Reihenfolge von Subviews auf andere Weise neu anordnet.

1

könnte eine andere Idee, Hintergrundfarbe des Subviews (7-Zellen) gesetzt werden, um den Standard ( vollständig transparent). Und setzen Sie nur den Hintergrund der Stapelansicht selbst auf weiß.

Ich habe ein ähnliches Problem, aber jede Unteransicht muss einen bestimmten Hintergrund haben. Und in meinem Fall könnte Ihr Hack helfen ... Danke dafür!

2

Seit iOS 9.0 ist es möglich, die z-Reihenfolge und Anordnung der Stapelansichtsuntersichten unabhängig voneinander festzulegen. Verwenden Sie die neue arrangedSubviews-Eigenschaft, um die Anordnung der Untersichten entlang der Achse der Stapelansicht anzugeben. Und verwenden Sie die Eigenschaft subviews, um die Subviews z-Reihenfolge basierend auf ihrem Index im Array anzugeben.

Die Stapelansicht stellt sicher, dass die arrangedSubviews-Eigenschaft immer eine Teilmenge der subviews-Eigenschaft ist.

Documentation for arrangedSubviews

1

Hier ist eine einfache Erweiterung auf UIStackView den Z-Index des UIStackView ‚s Subviews umzukehren und wahlweise das Layout erfordern:

extension UIStackView { 

    func reverseSubviewsZIndex(setNeedsLayout: Bool = true) { 
    let stackedViews = self.arrangedSubviews 

    stackedViews.forEach { 
     self.removeArrangedSubview($0) 
     $0.removeFromSuperview() 
    } 

    stackedViews.reversed().forEach(addSubview(_:)) 
    stackedViews.forEach(addArrangedSubview(_:)) 

    if setNeedsLayout { 
     stackedViews.forEach { $0.setNeedsLayout() } 
    } 
    } 

} 
4

Diese Swift Lösung kehrt die subview um Stapelansicht Verwenden der UIView-Methode sendSubview(toBack:) (docs here):

@IBOutlet weak var stackView: UIStackView! 

for view in stackView.arrangedSubviews { 
    stackView.sendSubview(toBack: view) 
} 

Während wir durch die angeordneten Ansichten der Stapelansicht (von unten nach oben) fortschreiten, wird das spätere höher) Ansichten werden nach unten geschoben, wodurch die Reihenfolge umgekehrt wird :-)