2014-09-10 10 views
7

Come si ottiene una vista per scorrere utilizzando l'autolayout per calcolarne le dimensioni del contenuto?UIScrollView si interrompe quando si utilizza il caricamento automatico per le dimensioni su iOS 8/Xcode 6 GM Seed

Sembra che Xcode 6 crei un vincolo "Altezza di layout incapsulato UIView" ogniqualvolta esiste una Vista di scorrimento (con Autolayout) e questo vincolo imposterà forzatamente l'altezza all'altezza del fotogramma (rendendo così la funzionalità di scorrimento di una vista di scorrimento inutili).

Layout broken - iPhone 5s Simulator in Xcode 6 GM Seed

Errore:

2014-09-09 21:06:01.059 ScrollViewLayoutBreaking[24488:88731] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x7f9a19ebd150 V:[UIView:0x7f9a19ea7f90(530)]>", 
    "<NSLayoutConstraint:0x7f9a19ec1370 V:[UIView:0x7f9a19ebd5e0(110)]>", 
    "<NSLayoutConstraint:0x7f9a19ea9ee0 V:[_UILayoutGuide:0x7f9a19ec18d0]-(0)-[UIView:0x7f9a19ea7f90]>", 
    "<NSLayoutConstraint:0x7f9a19ec1fa0 V:[UIView:0x7f9a19ea7f90]-(0)-[UIView:0x7f9a19ebd5e0]>", 
    "<NSLayoutConstraint:0x7f9a19e8d270 V:[UIView:0x7f9a19ebd5e0]-(5)-[_UILayoutGuide:0x7f9a19ec2260]>", 
    "<_UILayoutSupportConstraint:0x7f9a19ea0ac0 V:[_UILayoutGuide:0x7f9a19ec18d0(0)]>", 
    "<_UILayoutSupportConstraint:0x7f9a19ea7380 V:|-(0)-[_UILayoutGuide:0x7f9a19ec18d0] (Names: '|':UIScrollView:0x7f9a19ea76a0)>", 
    "<_UILayoutSupportConstraint:0x7f9a19e21d00 V:[_UILayoutGuide:0x7f9a19ec2260(0)]>", 
    "<_UILayoutSupportConstraint:0x7f9a19e8a930 _UILayoutGuide:0x7f9a19ec2260.bottom == UIScrollView:0x7f9a19ea76a0.bottom>", 
    "<NSLayoutConstraint:0x7f9a1c003f50 'UIView-Encapsulated-Layout-Height' V:[UIScrollView:0x7f9a19ea76a0(504)]>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7f9a19ebd150 V:[UIView:0x7f9a19ea7f90(530)]> 

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 

Edit: Tutte le viste all'interno di questo Scroll View sono autolayouted e già appuntato sia per la parte superiore di scorrimento View e in basso, così come entrambe le parti. Sono consapevole che non riuscire a vincolarlo su tutti e quattro i lati non creerà una dimensione del contenuto. L'autolayout e lo scorrimento sono corretti in iOS 7/XCode 5, ma lo stesso codice e lo stesso storyboard si interrompono in iOS 8/XCode 6.

+0

Domanda ridotta per renderlo più breve e più chiaro. Attualmente utilizzando Xcode 6 GM Seed. – Uzaak

+1

Qualche soluzione ancora? – jamespick

+0

Il meglio che sono riuscito a ottenere era una vista tabella con una singola cella di dimensionamento che funzionasse come la vista di scorrimento, nessuno stile separatore. Ma questo è abbastanza orribile da usarlo come ultima risorsa. – Uzaak

risposta

0

Capito di rispondere alla domanda poiché riceve risposte fino ad oggi.

Il codice è impostato automaticamente. Come indicato nella domanda, lo stesso codice ha prodotto un perfetto, nessun avviso/errori Scroll View utilizzando Xcode 5 e iOS 7 e interrompe un vincolo di layout che non ho creato manualmente in Xcode 6 GM Seed e iOS 8.

Sembra che fosse un bug di Xcode 6 GM Seed, lo stesso codice ha funzionato senza problemi nei futuri aggiornamenti di Xcode 6 dopo la prima versione, senza alcuna interruzione di vincoli.

0

Dal tuo screenshot, suppongo che tu stia utilizzando visualizzazioni personalizzate in una vista a scorrimento così ...

suo sito web di vista sono: STH, Foo, Bar, Baz, Qux, Blah, Woot, Lorem, Ipsum, Dolor

Nel codice è possibile impostare la dimensione del contenuto automaticamente con layout automatico impostando tutta la vostra viste di contenuto correlate tra loro, ad eccezione della vista superiore e inferiore ... queste devono essere correlate ai bordi della scrollview, Ecco un esempio:

-(void)example{ 

UIView *parentView; //Can be the Scroll View or the Scroll View superview, it's better for the ScrollView to be the Owner of the restrictions 
UIView *previousView; 
UIScrollView *scrollView; 

NSArray * arrayOfContentViews = @[STH,Foo,Bar,Baz,Qux,Blah,Woot,Lorem,Ipsum,Dolor]; 

for (UIView * currentView in arrayOfContentViews) { 

    //Important for Autolayout Restrictions 
    currentView.translateAutoresizingMask = NO; 
    [scrollview addSubview:currentView]; 

    if (previousView == nil) { 
     //For the Top, Left and Right Attribute Edges of the ScrollView 
     previousView = scrollView; 

     [parentView addConstraint:[NSLayoutConstraint constraintWithItem:currentView 
                   attribute:NSLayoutAttributeTop 
                   relatedBy:NSLayoutRelationEqual 
                    toItem:previousView 
                   attribute:NSLayoutAttributeTop 
                   multiplier:1.0 
                   constant:0.0]]; 

     //10% of the scrollview Frame Size (not Content Size) 
     [parentView addConstraint:[NSLayoutConstraint constraintWithItem:currentView 
                   attribute:NSLayoutAttributeHeight 
                   relatedBy:NSLayoutRelationGreaterThanOrEqual 
                    toItem:previousView 
                   attribute:NSLayoutAttributeHeight 
                   multiplier:0.1 
                   constant:0.0]];    

    }else{ 

     [parentView addConstraint:[NSLayoutConstraint constraintWithItem:currentView 
                   attribute:NSLayoutAttributeTop 
                   relatedBy:NSLayoutRelationEqual 
                    toItem:previousView 
                   attribute:NSLayoutAttributeBottom 
                   multiplier:1.0 
                   constant:0.0]]; 

     [parentView addConstraint:[NSLayoutConstraint constraintWithItem:currentView 
                   attribute:NSLayoutAttributeHeight 
                   relatedBy:NSLayoutRelationEqual 
                    toItem:previousView 
                   attribute:NSLayoutAttributeHeight 
                   multiplier:1.0 
                   constant:0.0]]; 
    } 

    [parentView addConstraint:[NSLayoutConstraint constraintWithItem:currentView 
                  attribute:NSLayoutAttributeLeft 
                  relatedBy:NSLayoutRelationEqual 
                   toItem:previousView 
                  attribute:NSLayoutAttributeLeft 
                  multiplier:1.0 
                  constant:0.0]]; 

    [parentView addConstraint:[NSLayoutConstraint constraintWithItem:currentView 
                  attribute:NSLayoutAttributeRight 
                  relatedBy:NSLayoutRelationEqual 
                   toItem:previousView 
                  attribute:NSLayoutAttributeRight 
                  multiplier:1.0 
                  constant:0.0]]; 


    previousView = currentView; 

    } 

//Last View Dolor to the Bottom Edge of the scrollView 
[parentView addConstraint:[NSLayoutConstraint constraintWithItem:previousView 
                 attribute:NSLayoutAttributeBottom 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:scrollView 
                 attribute:NSLayoutAttributeBottom 
                 multiplier:1.0 
                 constant:0.0]]; 
} 
0

Se si utilizza IB, selezionare UIViewController e selezionare Rimuovi tutti i vincoli dal menu AutoLayout in basso. Quindi selezionare Aggiungi vincoli mancanti. Questo risolverà il tuo problema

0

Affinché UIScrollView funzioni in verticale, ha bisogno della catena di sottoview da cima a fondo.

Ora, se si imposta la parte superiore/margine inferiore delle sue subviews si lasciarono alcuna idea per scorrere vista come dovrebbe renderlo autonomo in verticale come si calcola la propria altezza basata sul suo contenuto

Che cosa si deve fare è consentire a scrollview di determinare la propria altezza indipendentemente dai propri figli.

Quindi aggiungi la tua scrollview in un'altra vista come sottoview con il vincolo relativo a quella vista e quindi sei libero di aggiungere i bambini relativi a scrollview.