2015-10-26 9 views
8

Sto utilizzando l'UIStackView con la seguente configurazione:di UIStackView

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

Ciascuno degli elementi ha il proprio intrinsicContentSize quindi dovrebbe essere possibile per il UIStackView per fornire il proprio intrinsicContentSize. La documentazione indica che lo spacing viene utilizzato come spaziatura minima.

Esempio:

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

La intrinsicContentSize.width del stackView dovrebbe essere 30.

Invece ottengo:

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

che mi dice che non può essere fornita la intrinsicContentSize.

Qualcuno di voi sa se sto facendo qualcosa di sbagliato, se il comportamento è inteso o se questo è un bug?

risposta

10

Come di iOS 9.1, UIStackView non significa attuare intrinsicContentSize:

import UIKit 
import ObjectiveC 

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

uscita:

true 

Si potrebbe fare una sottoclasse di UIStackView e realizzare da soli se si ha realmente bisogno. Non dovresti aver bisogno, però. Se UIStackView è consentito (in base ai vincoli su di esso) di scegliere la propria dimensione, lo fa in base alla dimensione intrinseca del contenuto delle sottoview organizzate (o da altri vincoli impostati sulle dimensioni delle sottoview organizzate).

+0

Immagina di avere tutte le mie cose in uno stackview e aggiungo questo stackview alla sua superView. Ma ho ancora un'altra vista (in realtà ho una vista viewController) nella mia superView. Come vincolerebbero questi due l'uno contro l'altro in modo che lo stackview prendesse semplicemente le sue dimensioni intrinseche e lasciasse il resto per il childVC? – Honey

+0

Sembra che tu debba pubblicare la tua domanda di primo livello. –

+0

Hai ragione. Sto solo cercando di avere un'idea approssimativa. Come una risposta a 2 linee. Anche la ragione per cui non ho posto una domanda è perché questo è il mio PlanB ... il mio piano mi sta fallendo, ma sta anche prendendo tutta la mia larghezza di banda di codifica, quindi voglio solo ottenere una stima approssimativa di ciò che deve essere fatto. Puoi darmi una risposta in 2 righe? :/qualsiasi altra cosa farò solo una domanda – Honey

0

le immagini utente create hanno un'altezza e una larghezza intrinseche pari a zero. Prova a utilizzare i vincoli di autolayout invece per le Uiviews sottostanti.

È inoltre possibile utilizzare l'auto-estensione per dimensionare UIStackView, se si utilizza questo non impostare l'allineamento al centro, è necessario utilizzare invece Riempi.

esempio:

@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; 

Ciò funzionerà perché la stackview ha ora un'altezza e larghezza.

+0

Da dove proviene la variabile 'stackViewForCell'? – simonseyer