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
Dzięki za odpowiedź, udało mi się ustawić teraz. Wielkie dzięki za polecenia debugowania, są one naprawdę przydatne. – fabian789