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ę.

Author: SirRupertIII, 2012-11-21

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

 177
Author: matt,
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.
 162
Author: phatmann,
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.

 0
Author: n8tr,
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.

  1. Upewnij się, że autolayout jest włączony (IB na karcie "Inspektor plików")
  2. Upewnij się, że nie wprowadzasz żadnych zmian, które dotyczą granic, ramki itp. - to wszystko jest teraz robione przez ograniczenia Auto
  3. 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.

 -3
Author: JustLearningAgain,
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