2014-09-10 4 views
7

Jak uzyskać widok przewijania do pracy z funkcją autolayout, aby obliczyć rozmiar zawartości?UIScroll Wyświetl przerwy w korzystaniu z funkcji autolayout dla rozmiaru w systemie iOS 8/Xcode 6 GM Seed

Wygląda na to, że Xcode 6 utworzy ograniczenie "UIView Encapsute Layout Height", gdy tylko pojawi się Scroll View (z funkcją Autolayout), a to ograniczenie wymusi na siatce wysokość do wysokości klatki (w ten sposób renderując funkcjonalność przewijania widoku przewijania bezużyteczny).

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

Błąd:

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. 

Edycja: Wszystkie widoki wewnątrz tego zwoju View są autolayouted i już przypięte do obu Przewiń widok z góry iz dołu, a także obu stronach. Jestem świadomy, że niepowodzenie w wiązaniu go we wszystkich czterech stronach nie spowoduje utworzenia rozmiaru treści. Autolayout i przewijanie są poprawne w iOS 7/XCode 5, ale dokładnie ten sam kod i podział storyboardów w iOS 8/XCode 6.

+0

Skorygowane pytanie, aby było krótsze i bardziej przejrzyste. Obecnie używa Xcode 6 GM Seed. – Uzaak

+1

Jakieś rozwiązanie? – jamespick

+0

Najlepsze, co udało mi się wymyślić, to widok tabeli z pojedynczą komórką do samodzielnego rozmiaru, która będzie działać jak widok przewijania, bez stylu separatora. Ale to wystarczająco okropne, bym użył go jako absolutnie ostatniej szansy. – Uzaak

Odpowiedz

0

Pomyślałem, że odpowiem na to pytanie, ponieważ otrzymuję odpowiedzi do dnia dzisiejszego.

Kod jest autouczytowany poprawnie. Jak stwierdzono w pytaniu, ten sam kod wygenerował doskonałe, bez ostrzeżenia/błędów przewijanie, używając Xcode 5 i iOS 7, i złamałby ograniczenie układu, którego nie utworzyłem ręcznie w Xcode 6 GM Seed i iOS 8.

Wygląda więc na to, że był to bug nasion Xcode 6 GM, ten sam kod działał bezproblemowo w przyszłych aktualizacjach Xcode 6 po pierwszym wydaniu, bez żadnego łamania ograniczeń.

0

Według twojego Screenshotu, domyślam się, że używasz niestandardowych widoków w przewijanym widoku, więc ...

swoje treści widoki są: STH, Foo Bar, Baz, qux, bla, Woot, Lorem, Ipsum, Dolor

W kodzie można ustawić rozmiar treści automatycznie autoLayout poprzez ustawienie wszystkich Twoich widoki treści powiązane ze sobą, z wyjątkiem widoku od góry i od dołu ... te muszą być powiązane z krawędziami przewijania, Oto przykład:

-(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

Jeśli korzystasz z IB, wybierz kontroler UIViewController i wybierz opcję usunięcia wszystkich ograniczeń z menu AutoLayout na dole. Następnie wybierz dodaj brakujące więzy. To rozwiąże twój problem

0

Aby UIScrollView działał w pionie, potrzebuje łańcucha podelementów od góry do dołu.

Teraz, jeśli ustawiony górny/dolny margines jego subviews zostawiłeś pojęcia, aby przewinąć widok jak to powinno uczynić go siebie w pionie, jak oblicza własną wysokość na podstawie jego treści

Więc co należy zrobić, to zezwól na przewijanie, aby określić własną wysokość niezależnie od jej potomków.

Dodaj więc swój widok przewijania w innym widoku jako widok podrzędny z ograniczeniem związanym z tym widokiem, a następnie możesz dodać dzieci w stosunku do przewijania.

Powiązane problemy