2015-06-23 9 views
5

La scena principale mostra un bambino UIViewController, inserendo un Contenitore figlio nella sua vista e incorporando un figlio UIViewController in tale contenitore secondario. Lo faccio ctrl-trascinando dal contenitore figlio al bambino UIViewController nello storyboard e scegliendo il passaggio "incorpora".Layout automatico di un contenitore secondario che incorpora un UIViewController

Questo mi consente di incapsulare e riutilizzare il bambino UIViewController altrove. Penso che sia abbastanza standard. Ma non riesco a ottenere correttamente il layout automatico.

Ho fatto un semplice banco di prova per dimostrare questo: https://github.com/murraycu/ios-example-autolayout-of-child-container-views

Ha due UIViewControllers che sono incorporati in un controllore Tab in modo da poter passare da uno all'altro.

La scheda "Simple" mostra la SimpleViewController, che mostra un'immagine e un'etichetta, visto qui nella storyboard:

SimpleViewController

Né l'UIImage o UILabel ha specificato un vincolo altezza, pur avere un vincolo di uguale larghezza (uguale alla vista principale) per mantenere le larghezze semplici.

UILabel non è chiaramente molto elevato ma UIImage e UILabel hanno priorità di Hugging del contenuto leggermente diverse, rendendo le loro altezze non ambigue in base al layout automatico. Quindi grazie al layout automatico, quando imposto il suo testo in fase di esecuzione su un testo che richiede più spazio, occupa più spazio, prendendo spazio lontano dalla UII immagine sopra di esso. Questo è un bene - è il comportamento che io voglio, come si è visto nell'emulatore:

SimpleViewController in the emulator

Ora per il problema: la scheda "con figlio Container" mostra la WithChildContainerViewController, che mostra la stessa immagine, ma mostra il mio ChildViewController (incorporato in un contenitore secondario) anziché UILabel. E quel ChildViewController incorporato mostra UILabel. Qui è in storyboard:

WithChildContainerViewController

Tuttavia, il sistema di layout automatico ora non sembra sapere quanto spazio del contenitore figlio ha bisogno di mostrare tutto il testo nell'etichetta nel mio ChildViewController. Come nella scheda "Semplice", né UIImage né il Contenitore figlio hanno specificato un vincolo di altezza. Ora XCode lamenta che "L'altezza è ambiguo per 'vista contenitore' E sembra che questo nel simulatore:.

WithChildContainerViewController in the emulator

che è migliorata se aggiungo un vincolo al contenitore figlio, limitando il suo fondo verso il basso della vista padre, come suggerito da @iphonic: https://github.com/murraycu/ios-example-autolayout-of-child-container-views/commit/1d295fe0a6c4502764f8725d3b99adf8dab6b9ae ma l'altezza è ancora sbagliata:?

enter image description here

come posso lasciare che il sistema di layout automatico so cosa fare ho pensato di attuare intrinsicContentSize di UIView, ma UIViewController non è un UIView.

+1

è necessario aggiungere vincoli su 'View' di ChildViewController rispetto del contenitore su cui si sta visualizzando bambino. – iphonic

+0

Grazie. Suona bene, ma non riesco a trascinare Ctrl dalla vista principale del controller di Child View al containerView (il contenitore secondario) nell'altra scena (principale). Potresti essere più specifico, per favore? – murrayc

+0

@murrayc hai mai risolto questo problema? Sto vivendo lo stesso – Lneuner

risposta

2

Il suggerimento è, farlo a livello di programmazione piuttosto che tramite IB. Vedi sotto

_childController=[self.storyboard instantiateViewControllerWithIdentifier:@"ChildController"]; 

    [self addChildViewController:_childController]; 
    [_container addSubview:_childController.view]; 
    [_childController didMoveToParentViewController:self]; 

    _childController.view.frame=_container.bounds; 


    //add constraints   
    UIView *subView=_childController.view; 
    UIView *parent=_container; 


    subView.translatesAutoresizingMaskIntoConstraints=NO; 

    NSLayoutConstraint *width =[NSLayoutConstraint 
            constraintWithItem:subView 
            attribute:NSLayoutAttributeWidth 
            relatedBy:0 
            toItem:parent 
            attribute:NSLayoutAttributeWidth 
            multiplier:1.0 
            constant:0]; 
    NSLayoutConstraint *height =[NSLayoutConstraint 
            constraintWithItem:subView 
            attribute:NSLayoutAttributeHeight 
            relatedBy:0 
            toItem:parent 
            attribute:NSLayoutAttributeHeight 
            multiplier:1.0 
            constant:0]; 
    NSLayoutConstraint *top = [NSLayoutConstraint 
            constraintWithItem:subView 
            attribute:NSLayoutAttributeTop 
            relatedBy:NSLayoutRelationEqual 
            toItem:parent 
            attribute:NSLayoutAttributeTop 
            multiplier:1.0f 
            constant:0.f]; 

NSLayoutConstraint *leading = [NSLayoutConstraint 
              constraintWithItem:subView 
              attribute:NSLayoutAttributeLeading 
              relatedBy:NSLayoutRelationEqual 
              toItem:parent 
              attribute:NSLayoutAttributeLeading 
              multiplier:1.0f 
              constant:0.f]; 
    [parent addConstraint:width]; 
    [parent addConstraint:height]; 
    [parent addConstraint:top]; 
    [parent addConstraint:leading]; 

Spero che sia d'aiuto.

Cheers.

+0

Grazie. Ho provato questo in un ramo qui: https://github.com/murraycu/ios-example-autolayout-of-child-container-views/commits/iphonic-incode Migliora le cose - ora vedo il testo almeno , ma ora l'etichetta/vista bambino occupa troppo spazio verticale. Ho messo uno screenshot alla fine della domanda perché non posso metterne uno qui. – murrayc

+0

@murrayc Ho visto il tuo codice, tutto bene, ma nel controller WithChild è necessario impostare il vincolo di fondo per il contenitore con la superview, che è mancante e si ha un errore di layout. aggiungo che, funziona bene .. – iphonic

+0

@murrayc Vedi la mia forchetta qui https://github.com/iphonic/ios-example-autolayout-of-child-container-views – iphonic

0

@ codice di iphonic ma utilizzando Visual Format Lingua

_childController = [self.storyboard instantiateViewControllerWithIdentifier: @"ChildController"]; 

[self addChildViewController: _childController]; 
[_container addSubview: _childController.view]; 
[_childController didMoveToParentViewController: self]; 

//add constraints 
NSDictionary *views = @{@"subView": _childController.view, 
         @"parent": _container}; 

[parent addConstraints:[NSLayoutConstraint 
         constraintsWithVisualFormat: @"V:|[subView(==parent)]" 
         options: 0 
         metrics: nil 
         views: views]]; 

[parent addConstraints: [NSLayoutConstraint 
         constraintsWithVisualFormat:@"H:|[subView(==parent)]" 
         options: 0 
         metrics: nil 
         views: views]]; 
+0

Non è necessario elencare tell constraintsWithVisualFormat su subView e parent tramite il parametro views? – murrayc