UIScrollView nie używa ograniczeń autolayout
Mam widok przewijania i widok obrazu za nim i wypełniam go stalówkami. Używam autolayout. Mam dolną przestrzeń do superview i górną przestrzeń do superview na obu widokach. Widok obrazu robi dokładnie to, co chcę. Dla iphone 5 jest tam, gdzie chcę. A dla innych iphone ' ów pozostaje powyżej dolnej części ekranu, więc zmienia rozmiar poprawnie. Widok przewijania wygląda dobrze na iphone 5, ale na innych telefonach nie zmienia rozmiaru, więc przewija się w dół poniżej widoku aplikacji. Dostaję te wiadomości w dzienniku:
2012-11-21 10:42:38.576 LCHApp[12604:907] 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:0x1d8ea080 UIScrollView:0x1d8413b0.bottom == UIImageView:0x1d892110.bottom>",
"<NSAutoresizingMaskLayoutConstraint:0x1d8cca10 h=-&- v=-&- ScheduleViewNib:0x1d853630.height == UIScrollView:0x1d8413b0.height - 386>",
"<NSLayoutConstraint:0x1d8e5340 V:[UIImageView:0x1d892110]-(64)-| (Names: '|':ScheduleView:0x1d8efc30 )>",
"<NSAutoresizingMaskLayoutConstraint:0x1d8cf520 h=--& v=--& V:[ScheduleView:0x1d8efc30(480)]>",
"<NSLayoutConstraint:0x1d8eaed0 V:|-(45)-[UIScrollView:0x1d8413b0] (Names: '|':ScheduleView:0x1d8efc30 )>"
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x1d8ea080 UIScrollView:0x1d8413b0.bottom == UIImageView:0x1d892110.bottom>
Już próbowałem
[self setTranslatesAutoresizingMaskIntoConstraints:YES];
I
[self.myScrollView setTranslatesAutoresizingMaskIntoConstraints:YES];
Z tego co widzę to po prostu usuwa wszystkie ograniczenia z widoków. I nie tego chcę.
4 answers
Związek między UIScrollView i auto layout różni się od innych aspektów auto layout. Zasadniczo, gdyby prosty układ automatyczny mógł działać, nic nie przewijałoby się. Na przykład, jeśli podgląd podrzędny widoku przewijania byłby przypięty w normalny sposób przez ograniczenie do 10 punktów od góry widoku przewijania, byłby on absolutnie przypięty; nigdy nie poruszałby się, bez względu na sposób przewijania widoku przewijania.
Aby rozwiązać ten problem, uiscrollview, który używa autolayout działa w zupełnie nowy sposób. Dlatego, gdy mówisz "używam autolayout", musisz przygotować się na działanie rzeczy zupełnie inaczej niż wcześniej. Musisz albo użyć pojedynczego podglądu przewijania z translatesAutoresizingMaskIntoConstraints = YES
i rozmiarem treści jawnej, albo wszystko musi mieć translatesAutoresizingMaskIntoConstraints = NO
, A rozmiar zawartości zostanie wywnioskowany w sposób domniemany na podstawie ograniczeń podwidywalnych.
Jest to bardzo dobrze wyjaśnione w https://developer.apple.com/library/content/releasenotes/General/RN-iOSSDK-6_0/index.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-28 14:35:33
Bardzo ważne podczas używania auto-układu: musisz przypiąć prawą i / lub dolną część ostatniego podglądu do prawej i / lub dolnej części widoku przewijania. W ten sposób widok przewijania zna rozmiar zawartości. Na przykład:
[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:lastSubView
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:scrollView
attribute:NSLayoutAttributeRight
multiplier:1.0
constant:0]];
Moje podziękowania dla tej strony za dostarczenie doskonałego przykładu.
Straciłem przez to godziny i mam nadzieję oszczędzić innym mojego bólu.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-16 04:50:10
Aby UIScrollviews dobrze działał z ograniczeniami, używam takiego podejścia tutaj. W tej odpowiedzi omówię, jak uzyskać pionowo scrolling ScrollView działa również z obrotem urządzenia. Możesz dostosować podejście do pracy z poziomo przewijanie przewijania również. W przypadku przeglądarek przewijających się w obu kierunkach, nie dodawaj sztuczki ograniczenia szerokości dopasowanej do rozmiaru. Ale rób wszystko tak samo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:22
Kilka rzeczy.
- Upewnij się, że autolayout jest włączony (IB na karcie "Inspektor plików")
- Upewnij się, że nie wprowadzasz żadnych zmian, które dotyczą granic, ramki itp. - to wszystko jest teraz robione przez ograniczenia Auto
- trzymaj się z dala od automatycznej Maski. Będzie to konkurować z nowymi ustawieniami. Jeśli są one zrobione dobrze, możesz teraz układać swój przycisk i będzie działać świetnie. Oto jak.
Ten błąd mówi, że albo twoja stalówka, albo kontrolka a wewnątrz tej stalówki nie używa się układu automatycznego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-24 05:55:13