2015-10-26 6 views
8

Ich bin mit dem UIStackView mit folgenden Konfiguration:UIStackView eigenes intrinsicContentSize

let contentView = UIStackView() 
contentView.distribution = .EqualSpacing 
contentView.alignment = .Center 
contentView.spacing = horizontalSpacing 

Jedes der Elemente hat ein eigenes intrinsicContentSize so sollte es möglich sein, für die UIStackViewintrinsicContentSize seine eigenen zu liefern. Die Dokumentation besagt, dass spacing als Mindestabstand verwendet wird.

Beispiel:

view1: width=10 
view2: width=15 
spacing = 5 
[view1(10)]-5-[view2(15)] 

Die intrinsicContentSize.width des stackView sollte 30 sein.

Stattdessen erhalte ich:

▿ CGSize 
- width : -1.0 
- height : -1.0 { ... } 

, die mir sagt, dass die intrinsicContentSize nicht zur Verfügung gestellt werden kann.

Weiß jemand von Ihnen, wenn ich etwas falsch mache, wenn das Verhalten beabsichtigt ist oder wenn das ein Fehler ist?

Antwort

10

Ab iOS 9.1, UIStackView hat intrinsicContentSize nicht implementieren:

import UIKit 
import ObjectiveC 

let stackViewMethod = class_getInstanceMethod(UIStackView.self, "intrinsicContentSize") 
let viewMethod = class_getInstanceMethod(UIView.self, "intrinsicContentSize") 
print(stackViewMethod == viewMethod) 

Ausgang:

true 

Sie könnten eine Unterklasse von UIStackView machen und diese selbst implementieren, wenn Sie es wirklich brauchen. Das solltest du aber nicht tun müssen. Wenn UIStackView (durch die Einschränkungen dafür) erlaubt ist, seine eigene Größe zu wählen, geschieht dies basierend auf der inhaltlichen Größe der angeordneten Subviews (oder nach anderen Einschränkungen, die Sie für die Größe der angeordneten Subviews festgelegt haben).

+0

Stellen Sie sich vor, wenn ich alle meine Sachen in einem Stackview habe und ich diese Stackview zu seinem SuperView hinzufügen. Aber ich habe noch eine andere Ansicht (eigentlich habe ich eine viewControllers Ansicht) in meinem superView. Wie würde man diese beiden gegen einander einkesseln, so würde die Stapelansicht nur ihre intrinsische Größe annehmen und den Rest für das Kind-VC hinterlassen? – Honey

+0

Klingt so, als müssten Sie Ihre eigene Top-Level-Frage posten. –

+0

Sie haben Recht. Ich versuche nur eine ungefähre Vorstellung zu bekommen. Wie eine 2-Zeilen-Antwort. Der Grund, warum ich keine Frage gestellt habe, ist, dass dies mein PlanB ist ... mein PlanA versagt, aber ich nehme auch meine gesamte Codierungsbandbreite, also möchte ich nur eine grobe Schätzung dessen, was getan werden muss. Können Sie mir eine 2-Linien-Antwort geben? :/irgendetwas weiter Ich werde nur eine Frage stellen – Honey

0

Die von Ihnen erstellten UIViews haben eine intrinsische Höhe und Breite von Null. Verwenden Sie stattdessen Autlaylay-Einschränkungen für die zugrunde liegenden UIViews.

Sie können auch das automatische Layout verwenden, um die Größe des UIStackView zu bestimmen. Wenn Sie diese Option verwenden, stellen Sie die Ausrichtung nicht auf die Mitte ein, stattdessen sollten Sie stattdessen fill verwenden.

Beispiel:

@property (nonatomic, strong) UIStackView *firstStackView; 

@property (nonatomic, strong) UIView *redView; 
@property (nonatomic, strong) UIView *blueView; 
@property (nonatomic, strong) UIView *yellowView; 
@property (nonatomic, strong) UIView *greenView; 

@property (nonatomic, strong) NSArray *subViews; 

self.redView = [[UIView alloc] init]; 
self.redView.backgroundColor = [UIColor redColor]; 
self.blueView = [[UIView alloc] init]; 
self.blueView.backgroundColor = [UIColor blueColor]; 
self.yellowView = [[UIView alloc] init]; 
self.yellowView.backgroundColor = [UIColor yellowColor]; 
self.greenView = [[UIView alloc] init]; 
self.greenView.backgroundColor = [UIColor blackColor]; 
self.subViews = @[self.greenView,self.yellowView,self.redView,self.blueView]; 

self.firstStackView = [[UIStackView alloc] initWithArrangedSubviews:self.subViews]; 
self.firstStackView.translatesAutoresizingMaskIntoConstraints = NO; 
self.firstStackView.distribution = UIStackViewDistributionFillEqually; 
self.firstStackView.axis = UILayoutConstraintAxisHorizontal; 
self.firstStackView.alignment = UIStackViewAlignmentFill; 

[self.firstStackView.heightAnchor constraintEqualToConstant:40].active = YES; 
[self.firstStackView.widthAnchor constraintEqualToConstant:500].active = YES; 

Dies funktioniert, weil die stackview jetzt eine Höhe und Breite hat.

+0

Woher kommt die Variable 'stackViewForCell'? – simonseyer