2016-06-27 11 views
1

Ich versuche, zwei vertikale UIStackView s zu skalieren, so dass sie den Inhalt so anzeigen würden, wie ich es möchte. Die beiden vertikalen UIStackViews sind innerhalb einer anderen horizontalen UIStackView, die innerhalb einer UITableViewCell ist. Es gibt drei UILabel s in jeder vertikalen UIStackView. Hier ist die aktuelle Ansicht Hierarchie ich habe:UILabels in verschachtelten UIStackViews abgeschnitten?

View hierarchy

Die Bildansicht hat ihre Breite und Höhe begrenzt zu gleichen Anteilen haben. Die horizontale Stapelansicht hat eine Ausrichtung von .Center und eine Verteilung von .Fill. Die vertikale Stapelansicht 1 hat eine Ausrichtung von .Leading und eine Verteilung von .EqualSpacing. Die vertikale Stapelansicht 2 hat eine Ausrichtung von .Trailing und eine Verteilung von .EqualSpacing. Alle Beschriftungen haben nur eine Zeile und der Inhalt in der Stapelansicht 2 ist optional - ich setze die Eigenschaft text auf nil, wenn ich in der Stapelansicht 2 in tableView:cellForRowAtIndexPath: nichts anzeigen muss.

Ich habe versucht, das Label in Stapelansicht 2 zu erhalten, um Text ohne Abschneiden richtig anzuzeigen. Es ist in Ordnung, den Text in der vertikalen Stapelansicht 1 zu kürzen, aber es scheint, als würde die Stapelansicht 1 sich selbst anpassen, um den größten Teil der Breite zu übernehmen. Noch seltsamer, das passiert nicht die ganze Zeit. Es scheint häufiger zu passieren, wenn die Etiketten in der vertikalen Stapelansicht 1 sehr kurz sind. Es scheint auch, dass die vertikale Ansicht 2 in der Größe geändert wird, so dass es nur so breit ist wie das allerletzte Etikett, das normalerweise das kürzeste unter den drei Etiketten ist.

Hier ist, was ich ohne Erfolg versucht haben:

  • Einstellung vertikalen Stapel Ansicht 1 einen Inhalt umarmt Priorität hoher
  • haben 2 Einstellung vertikalen Stapel Ansicht, die einen Inhalt Kompressionswiderstand Priorität
  • erforderlich haben
  • Subclassing UIStackView so gibt sie einen intrinsicContentSize mit width so groß wie seine Etiketten intrinsicContentSize.width
  • rekursiv die angeordnet Subviews in vertikaler Stapel Ansicht Einstellung 2 um eine Inhaltskompressionswiderstandspriorität von erforderlich zu haben

Jede Hilfe würde geschätzt werden.

Antwort

0

Ich fand es heraus. Ich unterlagerte UIStackView, und zusätzlich zum Überschreiben intrinsicContentSize überging ich auch layoutSubviews, um seine eigene intrinsische Inhaltsgröße zu entwerten.

class NestedStackView: UIStackView { 
    override func intrinsicContentSize() -> CGSize { 
     var size = super.intrinsicContentSize() 

     for view in arrangedSubviews { 
      let viewSize = view.intrinsicContentSize() 

      if axis == .Vertical { 
       size.width = max(viewSize.width, size.width) 
      } else { 
       size.height = max(viewSize.height, size.height) 
      } 
     } 

     return size 
    } 

    override func layoutSubviews() { 
     invalidateIntrinsicContentSize() 
     super.layoutSubviews() 
    } 
} 
Verwandte Themen