2013-08-28 13 views
5

Aby zilustrować mój problem, stworzyłem następujący graficzny:autoLayout zamieszanie: Ograniczenia dla Scrollview z WebView i Nagłówek/Stopka Wyświetleń

Now in 3D

Czarne obramowanie wokół czerwonego kwadratu ma być ekran iPhone . Wewnątrz mamy czerwoną UIScrollView, która jest wyższa od ekranu. Jest on rzeczywiście tak wysoki jak UIWebView, wyświetlany powyżej na żółto. UIWebView jest podzbiorem UIScrollView, z przewijaniem wyłączone. Co więcej, mamy dwa niebieskie widoki, które lubię nazywać widokami nagłówka i stopki. Są to również subviews od UIScrollView, ale poza przewijanymi granicami.

Mój problem jest teraz: Jak skonfigurować ograniczenia automatycznego układu dla tego?

już udało się odzyskać wysokość UIWebView korzystając code from this answer a następnie zaktualizować UIScrollView „s contentSize odpowiednio. Jednak to nie jest dobre rozwiązanie, ponieważ szerokość UIWebView nie reaguje na zmiany szerokości UIScrollView.

I udało się również do konfiguracji ograniczeń układu widoku nagłówka jak tak (za pomocą Masonary):

[headerView makeConstraints:^(MASConstraintMaker *make) { 
    make.top.equalTo(@-100); 
    make.left.equalTo(@0); 
    make.width.equalTo(scrollView.width); 
    make.height.equalTo(@100); 
}]; 

Jednak konfigurowania układu widoku stopce niczym to nie działa:

[changeView makeConstraints:^(MASConstraintMaker *make) { 
    make.top.equalTo(scrollView.bottom) 
    make.left.equalTo(@0); 
    make.width.equalTo(scrollView.width); 
    make.height.equalTo(@100); 
}]; 

Czuję, że to nie może być zbyt trudne i doceniłbym jakąś pomoc od kogoś bardziej znajomego z układem automatycznym. Dzięki!

Odpowiedz

3

W programie Visual Format Język (VFL), ograniczenia byłyby:

[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(-100)-[headerView(100)]" options:0 metrics:nil views:views]]; 
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[footerView(100)]-(-100)-|" options:0 metrics:nil views:views]]; 
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[headerView]|" options:0 metrics:nil views:views]]; 
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[footerView]|" options:0 metrics:nil views:views]]; 

Lub jeśli jechaliśmy wymienić @"V:[footerView(100)]-(-100)-|" VFL z constraintWithItem połączeń, byłoby:

[footerView addConstraint:[NSLayoutConstraint constraintWithItem:footerView 
                 attribute:NSLayoutAttributeHeight 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:nil 
                 attribute:NSLayoutAttributeNotAnAttribute 
                 multiplier:1.0 
                 constant:100.0]]; 

[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:footerView 
                 attribute:NSLayoutAttributeBottom 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:scrollView 
                 attribute:NSLayoutAttributeBottom 
                 multiplier:1.0 
                 constant:100.0]]; 

I nie mogę powiedzieć, dlaczego twoja implementacja Masonary nie działa, ponieważ nie znam jej. Ale spróbuję jednego z powyższych i upewnię się.

Szczerze mówiąc, opisujesz ustawienie wysokości widoku internetowego i zastanawiam się, czy ustawiłeś ograniczenie wysokości widoku sieci (dobre) lub czy właśnie dostosowałeś wartość frame.size.height (zła). Nie podałeś jednak szczegółów dotyczących ustawienia wysokości widoku, więc nie mogę komentować dalej.

Bez względu na to, czy występują problemy związane z ograniczeniami, istnieją dwie przydatne techniki diagnostyczne. Jeśli nadal nie działa, to uruchomić aplikację na symulatorze, wstrzymać je, a następnie na (lldb) szybkiego wpisać:

po [[UIWindow keyWindow] _autolayoutTrace] 

Powinieneś zobaczyć coś takiego:

(lldb) po [[UIWindow keyWindow] _autolayoutTrace] 
$0 = 0x0715d6e0 
*<UIWindow:0x758aae0> 
| *<UIView:0x71630f0> 
| | *<UIScrollView:0x716a370> 
| | | *<HeaderView:0x716b860> 
| | | *<FooterView:0x716bbb0> 
| | | *<UIWebView:0x716c2b0> 
| | | | <_UIWebViewScrollView:0x7176a30> 
| | | | | ... 
| | | | | <UIWebBrowserView:0x797fe00> 
| | | <UIImageView:0x75e1360> 
| | | <UIImageView:0x75e2a60> 

upewnij się, nie ma tam żadnych ostrzeżeń.Jeśli wszystko wygląda ok, nie, to ja wtedy użyć następującego polecenia w wierszu (lldb):

po [[UIWindow keyWindow] recursiveDescription] 

Powinieneś zobaczyć coś takiego:

(lldb) po [[UIWindow keyWindow] recursiveDescription] 
$1 = 0x071c0ea0 <UIWindow: 0x758aae0; frame = (0 0; 320 568); autoresize = W+H; layer = <UIWindowLayer: 0x758b770>> 
    | <UIView: 0x71630f0; frame = (0 20; 320 548); autoresize = RM+BM; layer = <CALayer: 0x7163180>> 
    | | <UIScrollView: 0x716a370; frame = (0 0; 320 548); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x716b1d0>; layer = <CALayer: 0x716ad20>; contentOffset: {0, 16}> 
    | | | <HeaderView: 0x716b860; frame = (0 -100; 320 100); layer = <CALayer: 0x716b910>> 
    | | | <FooterView: 0x716bbb0; frame = (0 564; 320 100); layer = <CALayer: 0x716bee0>> 
    | | | <UIWebView: 0x716c2b0; frame = (0 8; 320 548); layer = <CALayer: 0x716c360>> 
    | | | | <_UIWebViewScrollView: 0x7176a30; frame = (0 0; 320 548); clipsToBounds = YES; autoresize = H; gestureRecognizers = <NSArray: 0x7177000>; layer = <CALayer: 0x7176c80>; contentOffset: {0, 0}> 
    | | | | | ... 
    | | | | | <UIWebBrowserView: 0x797fe00; frame = (0 0; 1024 1754); gestureRecognizers = <NSArray: 0x7173260>; layer = <UIWebLayer: 0x716d7f0>> 
    | | | | | | ... 
    | | | <UIImageView: 0x75e1360; frame = (1 540; 318 7); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x75e2980>> 
    | | | <UIImageView: 0x75e2a60; frame = (312 32.5; 7 530.5); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x75e2b00>> 

Spójrz na swoją różne wartości i wynikające frame zobacz, co się dzieje. To może pomóc w zdiagnozowaniu rozwiązania. Nie podajesz wystarczających informacji, aby zdiagnozować problem (mówisz nam, że stopka nie działała, ale nie mówisz nam, gdzie zostały nałożone ograniczenia). Jeśli wykonasz powyższe polecenia, możesz dokładnie ustalić, gdzie Twoje ograniczenie zakończyło się umieszczaniem stopki, a następnie dowiedzieć się, jak rozwiązać problem z tego miejsca.

Uwaga, zobaczysz, że moja headerView i footerView są wyświetlane w tych dwóch ofert jak HeaderView i FooterView klas zamiast UIView. Podczas diagnozowania problemów z ograniczeniami przydatne jest, jeśli widoki kluczy mają własną klasę, więc zdefiniowałem podklasy UIView bez implementacji, ale jeśli użyję tych unikatowych podklas dla mojego widoku nagłówka i stopki, to znacznie ułatwi to interpretację wyników powyżej poleceń (lldb).

@interface HeaderView : UIView 
@end 
@implementation HeaderView 
@end 

@interface FooterView : UIView 
@end 
@implementation FooterView 
@end 
+0

Dzięki za odpowiedź, udało mi się ustawić teraz. Wielkie dzięki za polecenia debugowania, są one naprawdę przydatne. – fabian789

Powiązane problemy