Jak mogę użyć Autolayout, aby ustawić ograniczenia w moim UIScrollview?

Spędziłem dwa dni na testowaniu różnych rozwiązań dla mieszanych i czystych podejść Autolayout , aby osiągnąć to, co było trywialną konfiguracją scrollview przed autolayout, i to jest teraz oficjalne-muszę być zbyt głupi. Ustawiam to głównie w Storyboardzie(cóż, tak jest po prostu).

Oto moja prośba o pomoc.

Viewtree:

UIView
-UIView
-UIView
..-UIScrollview
...-UIButton
...-UIButton
...-UIButton

Przyciski powinny przewijać się poziomo (od lewej do prawej i odwrotnie). Czy ktoś może proszę daj mi znać, jak ustawić ograniczenia, aby to osiągnąć za pomocą czystego Autolayout???

--

Próbowałem podejścia mieszanego, tak:

UIView
- UIView
- UIView
..-UIScrollview
...-UIView (contentview)
....-UIButton
....-UIButton
....-UIButton

...i ustawianie stałych ograniczeń szerokości i wysokości dla ustawień contentview i translatesAutoresizingMaskIntoConstraints zgodnie z TechNote Apple. Przyciski i widok przewijania są skonfigurowane przy użyciu ograniczeń. Powoduje to przewijanie widoku (yay) , ale niestety, przewija się zbyt daleko! Z tego co wiem, szerokość przewijania jest jakoś podwojona od tego co ustawiłem contentview na???!!!???

Próbowałem czystego podejścia autolayout, zarówno z contentview i bez. wszystkie widoki są translatesAutoresizingMaskIntoConstraints=NO, z wyjątkiem self.view. Przyciski mają stałe ograniczenia szerokości/wysokości i są przypięte do wszystkich czterech krawędzi widoku przewijania. Nic się nie przewija.

Więc jestem całkowicie zdumiony, dlaczego nie mogę go uruchomić poprawnie. Każda pomoc jest bardzo mile widziana, a jeśli potrzebujesz innych informacji, zapytaj!

Zaktualizowany zrzut ekranu z rozwiÄ…zaniem - buttonZ ograniczenia:

Tutaj wpisz opis obrazka

EDIT @ Jamie Forrest Rozwiązanie okazuje się więc błędnym ograniczeniem na ostatnim przycisku. Zamiast 6441, ustawiłem wartość ujemną, -6441. Trudną rzeczą jest to, że podczas ustawiania wartości w storyboard, istnieją dwie opcje na pasku narzędzi Pin:

Tutaj wpisz opis obrazka

Bieżąca wartość obszaru roboczego jest ujemna (nie powoduje przewijania), a opcja poniżej jest dodatnia (aktywacja przewijania). To znaczy, że nie jestem głupi, ale przynajmniej na wpół ślepa. chociaż, na moją obronę, nie jest to nieco niepokojące, że XCode nie pokazuje błąd dla" niepoprawne " ustawienie?

EDITED AGAIN To jest zabawne... zmiana wartości końcowej z -6441 (bez przewijania) na 6441 włączone przewijanie. Ale mój stary przyjaciel "za dużo contentsize" wrócił, co doprowadziło do rozmiaru treści dwa razy większego niż powinien być! Rozwiązaniem, aby uzyskać prawidłowe przewijanie treści, było ustawienie ograniczenia końcowego na ZERO! Nie jest to oczywiste podczas pracy w Storyboardzie, ale patrząc na kod @ Infinity James, jest to, co powinno być.

Author: Suragch, 2013-11-26

18 answers

Trudno zobaczyć dokładne wartości i konfigurację swoich ograniczeń, jak je wkleiłeś tutaj, więc nie jestem pewien, patrząc na zrzuty ekranu, gdzie się pomyliłeś.

Zamiast wyjaśnienia, co jest nie tak w Twojej konfiguracji, stworzyłem podstawowy przykładowy projekt z bardzo podobną hierarchią widoków i konfiguracją ograniczeń do tej, którą opisujesz. Poziome przewijanie działa zgodnie z oczekiwaniami w przykładowym projekcie, który wykorzystuje podejście "czystego AutoLayout", które opisuje Apple w uwadze technicznej .

Miałem też sporo problemów z uruchomieniem układu Auto do pracy z UIScrollView. Kluczem do jego uruchomienia jest upewnienie się, że wszystkie elementy w widoku przewijania, wzięte razem, mają ograniczenia, które ostatecznie łączą się ze wszystkimi stronami widoku przewijania i przyczyniają się do tego, że system AutoLayout może określić rozmiar zawartości widoku przewijania, który będzie większy niż jego ramka. Wygląda na to, że próbowałeś to zrobić w swoim kodzie, ale może miałeś jakieś zbędne ograniczenia, które sprawiały, że zawartość była zbyt mała.

Należy również zauważyć, jak inni wspominali, w AutoLayout i UIScrollview, nie ustawiasz już jawnie rozmiaru contentSize. System AutoLayout oblicza wielkość zawartości na podstawie Twoich ograniczeń.

Znalazłem również ten rozdział ebooka był bardzo pomocny w zrozumieniu, jak to wszystko działa. Mam nadzieję, że to pomoże.

 63
Author: Jamie Forrest,
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-11-27 03:32:33

Lol Witaj w klubie głupoty. Jestem jednym z założycieli. : D

Do przewijania pionowego: jedynym sposobem, w jaki mogłem go uruchomić (iOS 8, Xcode 6 i czysty autolayout) było dodanie następujących ograniczeń do mojego widoku przewijania (wszystkie związane z superview):

  • Równe SzerokoÅ›ci
  • Równe WysokoÅ›ci
  • Center Y Alignment
  • Center X Alignment

Moja struktura:

  UIView
   - ScrollView
    - Subview
    - Subview
    - Subview
    - Subview
    - ...

Oto ostateczny wynik:

To jest konfiguracja:

Pełny ekran

A oto projekt .

Mam nadzieję, że to uchroni kogoś przed pójściem spać o 5 rano. : D
 48
Author: backslash-f,
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-03-01 00:43:41

Prosty Samowystarczalny Przykład

Sądząc po dużej liczbie głosów na pytanie i małej liczbie głosów na odpowiedzi, ludzie nie znajdują tu zrozumiałego i szybkiego rozwiązania. Spróbuję coś dodać. Ten projekt jest samodzielnym przykładem wykonanym całkowicie w Kreatorze interfejsów. Powinieneś być w stanie przejść przez to w 10 minut lub mniej. Następnie możesz zastosować poznane pojęcia do własnego projektu.

Tutaj wpisz opis obrazka

The oryginalne pytanie pyta o przewijanie przycisków. Tutaj po prostu używam UIView s, ale mogą reprezentować dowolny widok. Wybrałem również przewijanie poziome, ponieważ zrzuty ekranu storyboard są bardziej kompaktowe dla tego formatu. Zasady są jednak takie same dla przewijania pionowego.

Kluczowe pojęcia

  • UIScrollView powinien używać tylko jednego podglÄ…du. Jest to "UIView", który sÅ‚uży jako Widok zawartoÅ›ci, aby pomieÅ›cić wszystko, co chcesz przewijać.
  • spraw, aby zawartość byÅ‚a wyÅ›wietlana i przewijana wyÅ›wietlacz rodzic ma jednakowÄ… wysokość dla przewijania poziomego. (Równe szerokoÅ›ci dla przewijania w pionie)
  • upewnij siÄ™, że caÅ‚a przewijana zawartość ma ustawionÄ… szerokość i jest przypiÄ™ta ze wszystkich stron.

Rozpocznij nowy projekt

Może to być tylko jeden widok aplikacji.

Storyboard

W tym przykładzie zrobimy poziomy widok przewijania. Wybierz kontroler widoku, a następnie wybierz dowolne formowanie w Inspektorze rozmiaru. Make the width 1,000 and the wysokość 300. To daje nam tylko miejsce na storyboardzie, aby dodać treść, która będzie przewijać.

Tutaj wpisz opis obrazka

Dodaj widok przewijania

Dodaj UIScrollView i przypnij wszystkie cztery strony do głównego widoku kontrolera widoku.

Tutaj wpisz opis obrazka

Add a Content View

Dodaj UIView jako podgląd podrzędny do widoku przewijania. To jest klucz. nie próbuj dodawać wielu podglądów do widoku przewijania. Wystarczy dodać pojedynczy UIView. To będzie to Widok zawartości dla innych widoków, które chcesz przewijać. Przypnij Widok zawartości do widoku przewijania ze wszystkich czterech stron.

Tutaj wpisz opis obrazka

Równe Wysokości

Teraz w zarysie dokumentu, polecenie Kliknij zarówno Widok zawartości, jak i widok nadrzędny widoku przewijania , aby wybrać oba. Następnie Ustaw wysokość na równą (Control przeciągnij z widoku zawartości do widoku przewijania). To też jest kluczowe. Ponieważ przewijamy poziomo, Widok zawartości widoku przewijania nie będzie wiedział, jak wysoko powinien być, chyba że ustawimy go w ten sposób.

Tutaj wpisz opis obrazka

Uwaga:

  • gdybyÅ›my przewijali zawartość w pionie, wtedy ustawilibyÅ›my szerokość widoku zawartoÅ›ci na równÄ… szerokoÅ›ci nadrzÄ™dnej widoku przewijania.

Dodaj treść

Dodaj trzy UIView s i podaj wszystkie ograniczenia. Użyłem 8-punktowych marginesów dla wszystko.

Tutaj wpisz opis obrazka

Ograniczenia:

  • Zielony widok: przypnij górnÄ…, lewÄ… i dolnÄ… krawÄ™dź. Szerokość 400.
  • czerwony widok: przypnij górnÄ…, lewÄ… i dolnÄ… krawÄ™dź. Szerokość 300.
  • Fioletowy widok: przypnij wszystkie cztery krawÄ™dzie krawÄ™dzi. Ustaw szerokość bez wzglÄ™du na pozostaÅ‚Ä… przestrzeÅ„ (w tym przypadku 268).

ustawienie ograniczeń szerokości jest również kluczowe, Aby widok przewijania wiedział, jak szeroki będzie jego widok zawartości be.

Zakończone

To wszystko. Możesz już uruchomić swój projekt. Powinien zachowywać się jak przewijany obraz na górze tej odpowiedzi.

W przypadku przewijania w pionie, po prostu zamień wszystkie kierunki szerokości i wysokości w tym przykładzie(przetestowane i działające).

Dalsze Badania

 29
Author: Suragch,
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-01-12 13:57:29

Rozmiar zawartości jest domyślnie ustawiany przez zastosowanie ograniczeń wewnątrz widoku UIScrollView.

Na przykład, jeśli masz UIScrollView wewnątrz UIView, będzie to wyglądać tak (jak jestem pewien, że jesteś świadomy):

    UIView *containerView               = [[UIView alloc] init];
    UIScrollView *scrollView            = [[UIScrollView alloc] init];
    [containerView addSubview:scrollView];
    containerView.translatesAutoresizingMaskIntoConstraints = NO;
    scrollView.translatesAutoresizingMaskIntoConstraints    = NO;
    NSDictionary *viewsDictionary       = NSDictionaryOfVariableBindings(containerView, scrollView);

    [containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|"
                                                                          options:kNilOptions
                                                                          metrics:nil
                                                                            views:viewsDictionary]];
    [containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|"
                                                                          options:kNilOptions
                                                                          metrics:nil

To ustawi scrollView tak, aby wypełniał rozmiar widoku zawartości (tak więc widok zawartości musi mieć określony rozmiar).

Możesz następnie dostosować rozmiar zawartości UIScrollView, domyślnie ustawiając go na wystarczająco duży, aby trzymać przyciski takie jak to:

    UIButton *buttonA                   = [[UIButton alloc] init];
    UIButton *buttonB                   = [[UIButton alloc] init];
    UIButton *buttonC                   = [[UIButton alloc] init];
    [scrollView addSubview:buttonA];
    [scrollView addSubview:buttonB];
    [scrollView addSubview:buttonC];
    buttonA.translatesAutoresizingMaskIntoConstraints       = NO;
    buttonB.translatesAutoresizingMaskIntoConstraints       = NO;
    buttonC.translatesAutoresizingMaskIntoConstraints       = NO;

    viewsDictionary                     = NSDictionaryOfVariableBindings(scrollView, buttonA, buttonB, buttonC);

    [scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[buttonA]-|"
                                                                       options:kNilOptions
                                                                       metrics:nil
                                                                         views:viewsDictionary]];
    [scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[buttonA]-[buttonB]-[buttonC]-|"
                                                                       options:NSLayoutFormatAlignAllBaseline
                                                                       metrics:nil
                                                                         views:viewsDictionary]];
 9
Author: Infinity James,
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-11-28 08:19:20

Jest tak wiele pytań dotyczących używania AutoLayout z UIScrollView, kluczowym punktem, który ignorujemy, jest to, że wewnętrzne widoki UIScrollView powodują ograniczenia wobec Content View , ale nie samego Uiscrollview. Zapoznaj się z uwagą techniczną TN2154 , można znaleźć:

Klasa uiscrollview przewija swoją zawartość zmieniając pochodzenie jej granic. Aby to działało z układem automatycznym, teraz górna, lewa, dolna i prawa krawędź w widoku przewijania oznacza krawędzie widoku zawartości.

Poniższy rysunek przedstawi, że: Tutaj wpisz opis obrazka

Możesz znaleźć przestrzeń końcową 500 punktów, jeśli ograniczenie zostanie wprowadzone do UIScrollView, Widok zostanie pominięty i powinien zostać zaktualizowany jego ramka. Jednak żadnych ostrzeżeń i błędów. Ponieważ wszystkie ograniczenia są sprzeczne z widokiem treści.

UIScrollView obliczy rozmiar widoku zawartości zgodnie z ograniczeniami widoków wewnętrznych. (Dla przykładu, Rozmiar zawartości: Szerokość = 100 (początek) + 200 (Szerokość widoku) + 500( koniec), wysokość = 131(górny odstęp) + 200(wysokość) + 269 (dolny odstęp)

Jak dodać ograniczenia dla widoków w widoku UIScrollView:

  1. obrazowanie pozycji widoków w widoku treści.
  2. Dodaj górny, prawy, dolny, lewy odstęp do krawędzi widoku zawartości, a także szerokość i wysokość tych widoków.

I wszystko jest zrobione.

An easy way aby poradzić sobie z AutoLayout za pomocą scrollview, należy dodać Widok kontenera zawierający wszystkie podglądy w widoku przewijania.

wniosek: kluczowym punktem, aby zrozumieć AutoLayout z UIScrollView jest wewnętrzne widoki, które ograniczają Widok zawartości, ale nie sam UIScrollView.

Dołączony przykładowy kod

 8
Author: x4snowman,
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
2014-09-22 14:30:40

Poniższe rozwiązanie zadziałało dla scrollView z autolayout i bez contentSize :

  1. przeciągnij n upuść widok przewijania do kontrolera viewController i zastosuj dowolne ograniczenia, aby pokryć żądaną przestrzeń.
  2. przeciągnij n upuść UIView wewnątrz widoku przewijania i upewnij się, że obejmuje całą przestrzeń scrollView i zastosuj ograniczenia , aby były górną, lewą, prawą, dolną spacją z widoku przewijania.
  3. Ustaw Wysokość (i szerokość, jeśli przewijanie w poziomie jest wymagane) wewnętrznego widoku zgodnie z potrzebą przewijania. Ta część może być również wykonana z kodu, jeśli jest to wymagane.
  4. krytyczne . Po ustawieniu wysokości na dużą wartość w punkcie (3), wróć do punktu (2) i upewnij się, że ustawisz górne, lewe, prawe, dolne wartości z powrotem na zero, ponieważ Xcode mógł je zmienić za ciebie, gdy wymusisz zmianę wysokości w punkcie (3).

I gotowe. Teraz możesz dodać dowolną liczbę kontrolek w tym widoku i zastosować ograniczenia istotne dla siebie (które nie wydają się działać bez tego widoku). Jeśli nie chcesz używać tego widoku, musisz zastosować ograniczenia dla każdej kontrolki związanej z przewijaniem (niezwiązanej ze sobą).


Przytłaczająca końcówka..............

Krytyczne . Załóżmy dla jasności, że UIScrollView jest 1000 szeroki i 100 wysoki. (Faktycznie to normalnie wartości te byłyby dynamiczne, oczywiście, w zależności od szerokości urządzenia itp. Ale na razie wystarczy powiedzieć 1000 szerokości i 100 wysokości.) Załóżmy, że robisz poziome przewijanie. Więc umieść UIView wewnątrz UIScrollView. (To jest "widok zawartości".) Ustaw wszystkie cztery ograniczenia widoku zawartości góra, dół, początek, koniec, do widoku przewijania. Niech wszystkie będą zerowe, nawet jeśli wydaje się to złe. Ustaw wysokość zawartości UIView na 100 i zapomnij o tym. Teraz: chcesz przewijać w poziomie, więc ustaw szerokość widoku zawartości na powiedzmy 1225.

Zauważ, że szerokość Widok zawartości jest teraz o 225 większy niż szerokość nadrzędnego widoku przewijania. W porządku: w rzeczywistości musisz to zrobić. Zauważ, że

...robisz nie ustawiasz szerokość końcową na ujemną 225...

Wydaje ci się, że musisz "dopasować" szerokości tak, jak zwykle. Ale jeśli to zrobisz, to w ogóle nie zadziała.

Musisz ustawić liczbę początkową i końcową na ZERO, nigdy ujemną (nawet jeśli szerokość jest "bigger")

Co ciekawe, możesz ustawić liczbę początkową / końcową na dowolną wartość dodatnią (spróbuj powiedzieć "50") i daje to pewien margines odbicia. (Często wygląda świetnie: spróbuj.) Każda wartość ujemna na obu końcach "po cichu pęknie".

Zauważ, że często Xcode (od 7.3.1 tak czy inaczej),

'pomoże' ustawić te wartości dla Ciebie na liczby ujemne!

Ponieważ próbuje automatycznie przeliczyć je za Ciebie. Jeśli tak to będzie po cichu złamać. Ustaw wszystkie cztery wartości na zero w pierwszej instancji. I ustawia szerokość widoku zawartości znacznie szerszą niż "1000" W przykładzie.


Edytowano: Skończyłem z używaniem UITableView zamiast UIScrollView dla większości moich wymagań. Ponieważ tableView wydaje mi się znacznie bardziej elastyczny i dynamiczny.

 5
Author: zeeawan,
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
2016-05-11 17:27:05

Zakładam, że masz problemy z contentSize. Sprawdź ten post na blogu o tym, jak poradzić sobie z contentSize przy użyciu "czystego" podejścia AutoLayout. Istotą tego jest to, że Twoje ograniczenia pośrednio definiują Rozmiar zawartości. Nigdy nie ustawia się go jawnie podczas korzystania z AutoLayout. Załączyłem przykładowy projekt na końcu posta na blogu, aby zademonstrować, jak to działa

 4
Author: Edward Huynh,
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
2015-09-30 14:54:37

W notatkach technicznych jest kawałek, który mogłeś przejrzeć. Domyślnie można ustawić rozmiar zawartości widoku przewijania za pomocą ograniczeń ustalonych na krawędziach widoku przewijania.

Oto prosty przykład. Utwórz storyboard z jednym widokiem, który ma jeden widok przewijania. Ustaw ograniczenia widoków przewijania, aby pasowały do rozmiaru widoku, w którym go umieszczasz.

Wewnątrz widoku przewijania dodaj pojedynczy widok. Jawnie Ustaw rozmiar tego widoku za pomocą ograniczeń (i upewnij się, że rozmiar jest większy niż widok przewijania).

Teraz dodaj cztery dodatkowe ograniczenia do tego wewnętrznego widoku blokującego cztery krawędzie wewnętrznego widoku do nadrzędnego widoku przewijania. Te cztery ograniczenia spowodują rozszerzenie rozmiaru zawartości, aby pomieścić widok wewnętrzny.

Jeśli masz kilka widoków, które chcesz dodać do widoku przewijanego, na przykład ułożonego poziomo, Zablokuj lewą stronę pierwszego podglądu po lewej stronie widoku przewijanego, Zablokuj podview względem siebie poziomo, a prawa strona ostatniego widoku podrzędnego po prawej stronie widoku przewijania. Ograniczenia te wymusiłyby rozszerzenie rozmiaru zawartości widoku przewijania w celu uwzględnienia wszystkich podwizów i ich ograniczeń.

 3
Author: Travis,
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-11-27 02:47:47

Jeśli twoje pytanie brzmi "jak umieścić kilka pól UITextFields w pionowo przewijanym widoku UIScrollView tak, że przesuwają się z drogi klawiatury, gdy mają fokus", najlepsza odpowiedź brzmi:

Nie.

Zamiast tego użyj kontrolera UITableViewController ze statycznymi komórkami.

Otrzymujesz to zachowanie przewijania za darmo, a wszystkie wstawki zawartości działają tylko wtedy, gdy kontroler widoku jest wyświetlany wewnątrz kontrolera UINavigationController.

 3
Author: Robert Atkins,
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
2015-01-14 16:18:26

Powinieneś uporządkować swój układ w ten sposób
ViewControllerView zawiera ScrollView, ScrollView zawiera ContainerView, ContainerView zawiera 2 Labels
Tutaj wpisz opis obrazka

Następnie wykonaj 3 kroki aby sprawić, że twoje {[1] } może przewijać

  1. Ustawienie ScrollView pin (Góra/Prawo/Dół/Lewo) na ViewControllerView
    • Ustawienie ContainerView pin (Góra/Prawo/Dół/Lewo) na ScrollView
    • Zestaw Horizontally in Container (don't set Vertically in Container)
    • Label1 pin (top / right / left) to ContainerView
    • Label1 pin (right/left / bottom) to ContainerView and top to Label1

Tutaj wpisz opis obrazka

Oto projekt demo

Hope this help

 3
Author: Phan Van Linh,
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-01-09 06:25:16

Czyste podejście autolayout działa pięknie, ale trudno jest skonfigurować, jeśli migrujesz z nieautolayout. Robiłam to już kilka razy i mam kilka ogólnych porad:

  • Zacznij od maÅ‚ego: nawet jeÅ›li oznacza to odtworzenie widoków storyboardu, zacznij od kilku elementów i powoli buduj widoki, upewniajÄ…c siÄ™, że przewijanie dziaÅ‚a po dodaniu kilku elementów.
  • WyÅ‚Ä…cz translatesAutoresizingMaskIntoConstraints na wszystkim: to byÅ‚o zawsze przyczynÄ… konfliktów ograniczeÅ„ dla mnie.
  • Ustaw ograniczenia uiscrollview poprawnie: upewnij siÄ™, że widok przewijania jest podÅ‚Ä…czony ze wszystkich stron do widoku nadrzÄ™dnego, w przeciwnym razie po prostu nie rozszerzy siÄ™.
 1
Author: Nick,
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-11-27 02:28:04

Po pewnym czasie zajmowania się tym problemem, w końcu znalazłem rozwiązanie. Pracuję z storyboardami o rozmiarach uniwersalnych (600x600). Utworzyłem UIView (contentView) o rozmiarze widoku przewijania i utworzyłem ograniczenia do góry, dołu, wiodącej i końcowej do widoku przewijania. Następnie przyciąłem rozmiar contentView ręcznie do 600x600. Storyboard przestał próbować zmienić rozmiar wszystkiego i mogłem pracować, ale widok wyglądał okropnie na prawdziwym urządzeniu lub symulatorze. Zrobiłem 2 gniazdka tego obciętego rozmiaru.

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *contentViewWidthConstraint; 
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *contentViewHeightConstraint;

Następnie w viewDidLoad

CGSize viewSize = self.view.frame.size;
self.contentViewWidthConstraint.constant = viewSize.width;
self.contentViewHeightConstraint.constant = viewSize.height;
Działa świetnie.
 1
Author: Cristian Pena,
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
2015-01-26 13:41:05

Spędziłem dni próbując znaleźć rozwiązanie, JAK UŻYWAĆ AutoLayout view wbudowanego widoku przewijania, aby wyśrodkować widok przewijania w widocznym ekranie, który działa we wszystkich urządzeniach / wymiarach ekranu, a także z obracaniem ekranu.

Spędziłem dni próbując to zrobić tylko z Autolayout, i zbliżyłem się, ale nigdy wystarczająco blisko. Tak więc w końcu musiałem dodać 3 linie kodu na ekran, jak również, w viewDidLoad.

Patrz rozwiązanie poniżej:

  1. Utwórz widok przewijania i wypełnij go whatever objects you want
  2. Włącz automatyczny układ
  3. Następnie Wyśrodkuj Przewijanie w pionie i poziomie ScrollView Centrum
  4. Wybierz widok a następnie 'dodaj brakujące ograniczenia' - to robi swoje
  5. w rezultacie powstaje wiele ograniczeń. Istnieją 2 nowe utworzone dla widoku: "Horiz space scrollview to View" i "Vert space scrollview to view" lub odwrotnie.
  6. Usuń 'Horiz space scrollview to View' tak teraz zostały ci 3 Ograniczenia widoku. 2 do wprowadzania widoku przewijania w widoku i jeden do ustawiania pionowego odstępu między widokiem przewijania a widokiem
  7. teraz połącz ograniczenie Vert z kodem, klikając i Ctrl przeciągając je do pliku nagłówkowego i tworząc IBOutlet NSLayoutConstraint (nazwałem moje ograniczenievertvtosv)
  8. Teraz idź do.plik m i dodaj te linie kodu do viewDidLoad (graj z ilością wypełnienia, aby uzyskać poprawny vert centrowanie)

    if (IPAD)
    

    { siebie.constraintVertVtoSV.stała = 150,0; }

  9. Powinno to teraz działać na wszystkich urządzeniach i być odpowiednio wyśrodkowane i nadal prawidłowo przewijać.

 1
Author: Guy,
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
2015-04-19 08:32:03

Jeśli tak jak ja po prostu używasz statycznej zawartości bez liczników wewnątrz subview, możesz zrobić tak:

override func viewDidLayoutSubviews() {
    scrollView.contentSize = CGSizeMake(320, 800)
}
 1
Author: Antzi,
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
2015-06-15 14:24:20

Podobny problem mam dzisiaj z iOS 8.4, Xcode 6.4

Istnieje widok zawierajÄ…cy widok przewijania, zawierajÄ…cy widok contentView (UIView) zawierajÄ…cy podview.

Wszystko jest Układ auto wszędzie. Krawędzie widoku przewijania są przypięte do krawędzi widoków nadrzędnych z ograniczeniami. Krawędzie widoku zawartości są przypięte do krawędzi widoku przewijania z ograniczeniami.

Pierwotnie Widok zawartości odmawiał rozmiaru jako pełnej szerokości widoku przewijania. Musiałem dodać dodatkowe ograniczenie widoku zawartości, aby jego szerokość była zgodna z nadrzędnym widokiem przewijania. Albo mogę ustawić widok treści.centerX = = scrollView./ align= "left" / Jeden z nich, oprócz przypinania krawędzi, nagle sprawił, że widok treści był odpowiednio rozmiar.

// Either one of these additional constraints are required to get autolayout to correctly layout the contentView. Otherwise contentView size is its minimum required size
scrollView.addConstraint(NSLayoutConstraint(item: contentView, attribute: .CenterX, relatedBy: .Equal, toItem: scrollView, attribute: .CenterX, multiplier: 1.0, constant: 0))
scrollView.addConstraint(NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: scrollView, attribute: .Width, multiplier: 1.0, constant: 0.0))

Przypinanie krawędzi widoku zawartości do widoku przewijania za pomocą wizualnych ograniczeń formularza,

let cvConstraints = ["H:|[contentView]|", "V:|[contentView]|"]

Używam procedury do iteracji tablicy i dodawania jej do widoku przewijania.

 1
Author: David,
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
2015-08-04 03:45:45

Miałem podobny problem. Ustawiłem wszystkie ograniczenia i zawsze zastanawiałem się, dlaczego nadal zmienia rozmiar niektórych podwidywań. Moim rozwiązaniem było ustawienie clipsToBounds na tak.

 1
Author: Chuck,
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
2015-08-28 14:17:32

W swift możesz użyć tego rozwiązania roboczego.

Kontrasty

ScrollView: Leading, Trailing, Top, Bottom = Superview

ContentView: Początek, Koniec, Góra, Dół = ScrollView. Wysokość stała / względem treści.

Możesz ustawić ograniczenie szerokości (contentView) na równe ScrollView superview, ale wybierz Usuń Usuń w czasie kompilacji, ponieważ będziesz dodawać to ograniczenie programowo. To jest po to, aby IB nie narzekał ostrzeżeniami.

extension UIView {

    func setupContentViewForViewWithScroll(contentView vwContent : UIView) {
        //Set constraint for scrollview content
        let constraint = NSLayoutConstraint(item: vwContent, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: self.bounds.size.width)
        vwContent.addConstraint(constraint)
        self.layoutSubviews()
    }

}

I w kontrolerze widoku viewDidLayoutSubviews wywołuję tę metodę:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.view.setupContentViewForViewWithScroll(contentView: vwContent)
}
 1
Author: Ibrahim Yildirim,
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
2015-10-20 11:51:56

Wiem, że to rozwiązanie dla laika, a nie to, co sugeruje Apple w docu, ale u mnie działało dwa razy, z inną treścią i można je bardzo szybko skonfigurować: W kontrolerze widoku storyboard włóż UIView. W UIView wstawić Widok tabeli, dynamiczne, 0 prototypowe komórki, Styl Zwykły lub zgrupowane. W widoku tabeli Wstaw Widok przewijania, w widoku przewijania Wstaw zawartość. To wszystko, brak ustawień w niestandardowym kontrolerze widoku.

 0
Author: Rinaldo,
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
2014-05-08 10:02:01