Jak korzystać z UIScrollView w Storyboard

Mam widok przewijania z treścią o wysokości 1000px i chciałbym móc go rozłożyć, aby ułatwić projektowanie na storyboardzie.
Wiem, że można to zrobić programowo, ale naprawdę chcę to zobaczyć wizualnie. Za każdym razem, gdy umieszczam widok przewijania na kontrolerze widoku, nie przewija się. Czy jest możliwe, aby to działało tak, jak chcę, czy muszę to zrobić w kodzie?

Author: Forge, 2012-10-16

16 answers

Odpowiadam na własne pytanie, ponieważ właśnie spędziłem 2 godziny, aby znaleźć rozwiązanie, a StackOverflow pozwala na ten styl QA.

Zacznij do końca oto, jak sprawić, by działało w storyboardzie.

1: Przejdź do kontrolera widoku i kliknij na Attribute Inspector.

2: Zmień rozmiar na Freeform zamiast wnioskować.

3: Przejdź do głównego widoku na tym storyboardzie, nie widoku przewijania, ale widoku najwyższego poziomu.

4: Kliknij Size Inspector i ustaw ten widok na żądany rozmiar. I changed my wysokość do 1000.

Teraz zobaczysz, że storyboard ma konfigurację widoku, dzięki czemu możesz zobaczyć całą wysokość przewijania, aby ułatwić projektowanie.

5: upuść widok przewijania i rozciągnij go, aby zajął cały widok. Powinieneś teraz mieć widok przewijania o rozmiarze 320,1000 siedzący na widoku w kontrolerze widoku.

Teraz musimy go przewijać i musimy go poprawnie wyświetlać.

6: Kliknij na widok przewijania i kliknij na Identity Inspector.

7: Dodaj User Defined runtime attribute za pomocą klawiatury contentSize wpisz rozmiar i wprowadź Rozmiar zawartości. Dla mnie jest (320, 1000).

Ponieważ chcemy zobaczyć cały nasz widok przewijania na storyboardzie, rozciągnęliśmy go i ma ramkę 320,1000, ale aby to działało w naszej aplikacji, musimy zmienić ramkę w dół do widocznego widoku przewijania.

8: Dodaj {[6] } z klawiaturą frame z typem RECT i 0,0,320,416.

Teraz kiedy uruchomimy naszą aplikację będziemy mieli widoczny scrollview ma ramkę 0,0,320, 416 i można przewijać w dół do 1000. Jesteśmy w stanie układać nasze Podglądy i obrazy oraz inne rzeczy w Storyboardzie tak, jak chcemy, aby wyglądały. Następnie nasze atrybuty runtime upewnij się, że wyświetlają go poprawnie. Wszystko to bez 1 linijki kodu.

 149
Author: Alex Reynolds,
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-10-15 23:44:12

Oto kroki z Auto Layout to działało dla mnie na XCode 8.2.1.

  1. Wybierz Size Inspector z View Controller i zmień Simulated Size na Freeform z wysokością 1000 zamiast Fixed.
  2. Zmień nazwę widoku View Controller na RootView .
  3. Przeciągnij Scroll View jako podgląd podrzędny RootView i zmień jego nazwę na ScrollView .
  4. Dodaj ograniczenia dla ScrollView :
    • ScrollView[Top, Bottom, Leading, Trailing] = RootView [Top, Bottom, Leading, Trailing]
  5. Przeciągnij Vertical Stack View jako podgląd ScrollView i zmień jego nazwę na ContentView .
  6. Dodaj ograniczenia dla ContentView :
    • ContentView .wysokość = 1000
    • ContentView[Top, Bottom, Leading, Trailing, Width] = ScrollView[Top, Bottom, Leading, Trailing, Width]
  7. Wybierz Attributes Inspector z ContentView i zmień Distribution na Fill Equally zamiast Fill.
  8. przeciągnij View jako subview ContentView i zmień jego nazwę na RedView .
  9. Ustaw Red jako tło RedView.
  10. przeciągnij View jako subview ContentView i zmień jego nazwę na BlueView .
  11. Ustaw Blue jako tło BlueView .
  12. Wybierz RootView i kliknij przycisk Update Frames.
    • Update Frames jest nowy przycisk w Xcode8 zamiast przycisku Resolve Auto Layout Issues. Wygląda jak przycisk odświeżania, znajdujący się na pasku sterowania poniżej storyboardu: Przycisk Aktualizuj Ramki

Hierarchia widoku:

  • RootView
    • ScrollView
      • ContentView
        • RedView
        • BlueView

View Controller Scene (Height: 1000):

scena

Run on iPhone7 (Height: 1334 / 2):

demo

 45
Author: jqgsninimo,
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-06 12:12:13

Oto kroki, które działały dla mnie na iOS 7 i XCode 5.

  1. Przeciągnij Kontroler ViewController (pochodzi z UIView "Widok").

    1.1 Wybierz "kontroler widoku" i wybierz "Inspektor plików" i odznacz "układ Automatyczny".

  2. W tym celu należy kliknąć przycisk "Pokaż".]}
  3. Wybierz ScrollView i otwórz "Inspektor tożsamości".
  4. Wprowadź "contentSize" dla ścieżki klawiatury. Wybierz "rozmiar" dla typu. I wejść {320, 1000} na wartość.

    Uwaga: Krok 4 to po prostu stwierdzenie, że scroller zawiera pewną zawartość, której rozmiar wynosi 320x1000 jednostek. Ustawienie contentSize spowoduje, że scroller będzie działał.

  5. Wybierz kontroler widoku, wybierz "Inspektor atrybutów", a następnie wybierz Freeform z rozmiaru.

    Uwaga: krok 5 pozwoli nam zmienić rozmiar "widoku", który jest dostarczany przez kontroler widoku.

  6. Wybierz "Widok", a następnie wybierz "Inspektor rozmiaru".

  7. ustaw szerokość na 320 i wysokość do 1000.

Uwaga: 5, 6 i 7 jest wyłącznie dla nas, aby zobaczyć rozciągnięty lub cały Rozszerzony widok wewnątrz storyboardu. Uwaga: Pamiętaj, aby odznaczyć opcję "Układ Automatyczny" na kontrolerze widoku.

Twoja hierarchia widoków powinna wyglądać następująco: hierarchia

 43
Author: Raja Rao,
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-03-18 20:01:40

Po wielu godzinach prób i błędów, znalazłem bardzo łatwy sposób, aby umieścić zawartość do przewijania, które są "poza ekranem". Testowane z XCode 5 i iOS 7. Możesz to zrobić prawie całkowicie w Storyboardzie, używając 2 małych sztuczek /obejść:

  1. przeciągnij kontroler widoku na swój storyboard.
  2. przeciągnij widok przewijania na tym kontrolerze viewController, dla demo możesz pozostawić domyślny rozmiar, pokrycie całego ekranu.
  3. Teraz przychodzi trick 1 : przed dodaniem jakiegokolwiek elementu do scrollView, przeciągnij zwykły "widok" (ten widok będzie większy niż ekran i będzie zawierał wszystkie elementy podrzędne, takie jak przyciski, etykiety, ...nazwijmy to " enclosing view ").
  4. niech to zamknie rozmiar y widoku w Inspektorze rozmiaru na przykład 800.
  5. Wrzuć etykietę do widoku załączającego, gdzieś w pozycji y 200, nazwij ją "Etykieta 1".
  6. Trick 2 : upewnij się, że załączający widok jest wybrany (, a nie scrollView !) i ustaw jego pozycję Y na przykład -250, aby można było dodać element "poza" ekranem
  7. Wrzuć Etykietę, gdzieś na dole ekranu, nazwij ją "etykieta 2". Ta etykieta jest w rzeczywistości "poza ekranem".
  8. Zresetuj pozycję Y załączającego widoku na 0, nie będziesz już widzieć etykiety 2, ponieważ była ona umieszczona poza ekranem.

Do tej pory dla pracy storyboard, teraz musisz dodać pojedynczą linię kodu do metody viewController 's' viewDidLoad aby ustawić zawartość scrollViews tak, aby zawierała cały 'widok zamykający'. Nie znalazłem sposobu, aby to zrobić w Storyboardzie:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.scrollView.contentSize = CGSizeMake(320, 800);
}

Możesz spróbować to zrobić, dodając contentSize klawiaturę jako size do widoku przewijania w Inspektorze tożsamości i ustawiając ją na (320, 1000).

Myślę, że Apple powinno to ułatwić w storyboardzie, w TableViewController możesz po prostu przewijać ekran w Storyboardzie (wystarczy dodać 20 komórek, a zobaczysz, że możesz po prostu przewijać), powinno to być możliwe za pomocą ScrollViewController też.

 13
Author: Ronny Webers,
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-10-12 18:13:26

Przewijanie do pracy w iOS7 i automatyczny układ w iOS 7 i XCode 5.

Oprócz tego: https://stackoverflow.com/a/22489795/1553014

Najwyraźniej wystarczy:

  1. Ustaw wszystkie ograniczenia widoku przewijania (np. najpierw popraw widok przewijania)

  2. Następnie Ustaw ograniczenie distance-from-scrollView na dole większości pozycji do przewijania widoku (który jest super view).

Uwaga: Krok 2 powie storyboard, w którym ostatni fragment treści znajduje się w widoku przewijania.

 8
Author: Raja Rao,
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 12:34:30

W tym przykładzie odznaczyłem funkcję Autolayout Buildera interfejsu. I nadal używam (bez żadnego powodu) stosunkowo starej wersji 4.6.1 Xcode.

Zacznij od kontrolera widoku, który ma widok przewijania (widok główny).

1: Dodaj Widok kontenera z biblioteki obiektów do widoku przewijania. Zauważ, że nowy kontroler widoku jest dodawany do storyboardu i jest połączony z kontrolerem widoku za pomocą widoku przewijania.

2: Wybierz widok kontenera i, na Inspektorze rozmiaru, zakotwiczyć go w górę iw lewo bez automatycznej zmiany rozmiaru.

Tutaj wpisz opis obrazka

3: zmień jego wysokość na 1000. (W tym przykładzie użyto 1000. Należy zastosować wymaganą wartość.)

4: wybierz nowy kontroler widoku i z Inspektora atrybutów Zmień rozmiar na dowolny.

Tutaj wpisz opis obrazka

5: Wybierz widok nowego kontrolera widoku i, na Inspektorze rozmiaru, Zmień wysokość na 1000 (która jest równa wysokość widoku kontenera).

6: aby przetestować później, będąc jeszcze w widoku nowego kontrolera widoku, Dodaj etykietę u góry i u dołu widoku.

7: Wybierz widok przewijania z oryginalnego kontrolera widoku. W Inspektorze tożsamości Dodaj atrybut z ścieżką klawiatury ustawioną na contentSize, wpisz na Size i wartość ustawioną na {320, 1000} (lub rozmiar widoku kontenera).

Tutaj wpisz opis obrazka

8: Uruchom na 4-calowym symulatorze iPhone ' a. Powinieneś być w stanie przewijać od górnej etykiety do dolnej etykiety.

[[0]}9: Uruchom na 3,5-calowym symulatorze iPhone ' a. Powinieneś mieć możliwość przewijania od górnej etykiety do dolnej etykiety.

Pamiętaj, że Xcode 4.6.1 może budować tylko dla iOS6 i poniżej. Korzystając z tego podejścia i budowania dla iOS6, nadal jestem w stanie osiągnąć te same wyniki, gdy aplikacja jest uruchomiona na iOS7.

 7
Author: yoninja,
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-12-23 10:00:26

Zauważ, że w obrębie UITableView możesz przewijać widok tableview, wybierając komórkę lub element w niej i przewijając go w górę lub w dół za pomocą gładzika.

Dla UIScrollView, podoba mi się sugestia Alexa, ale polecam tymczasowo zmianę kontrolera widoku na freeform, zwiększenie wysokości widoku głównego, zbudowanie interfejsu użytkownika( kroki 1-5), a następnie zmianę go z powrotem do standardowego domyślnego rozmiaru, gdy skończysz, aby nie trzeba było twardego rozmiaru zawartości kodu w trybie runtime atrybuty. Jeśli to zrobisz, otwierasz się na wiele problemów konserwacyjnych, próbując obsługiwać zarówno urządzenia 3,5", jak i 4", a także możliwość zwiększenia rozdzielczości ekranu w przyszłości.

 5
Author: Kyle Clegg,
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-10-10 07:04:27

Powinieneś ustawić właściwość contentSize tylko w viewDidAppear, tak jak ta próbka:

- (void)viewDidAppear:(BOOL)animated{

     [super viewDidAppear:animated];
     self.scrollView.contentSize=CGSizeMake(306,400.0);

}

Rozwiązuje problemy z autolayout i działa dobrze na iOS7.

 4
Author: Lucio Fonseca,
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-01-15 08:33:42

W iOS7 odkryłem, że gdybym miał Widok wewnątrz UIScrollView na kontrolerze o swobodnej wielkości, nie przewijałby się w aplikacji, bez względu na to, co zrobiłem. Pobawiłem się i znalazłem, że wygląda na to, że działa, który nie używa FreeForms:

  1. Wstawianie widoku UIScrollView wewnątrz głównego widoku kontrolera Viewcontrollera

  2. Ustaw odpowiednie ograniczenia Autolayout w widoku przewijania. Dla mnie 0 do góry Layout guide i od 0 do dołu layout Guide

  3. Wewnątrz widok przewijania, umieść Widok kontenera. Ustaw jego wysokość na jaką chcesz (np. 1000)

  4. Dodaj ograniczenie wysokości (1000) do kontenera, aby nie zmieniał rozmiaru. Dno będzie za końcem formularza.

  5. Dodaj wiersz [self.scrollView setContentSize: CGSizeMake (320, 1000)]; do kontrolera ViewController zawierającego scrollView (który podłączyłeś jako IBOutlet)

ViewController (automatycznie dodany), który jest skojarzony z Kontener będzie miał żądaną wysokość (1000) w narzędziu Interface Builder i będzie przewijał się prawidłowo w oryginalnym kontrolerze widoku. Możesz teraz użyć kontrolera widoku kontenera do układania elementów sterujących.

 4
Author: nh32rg,
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-29 03:36:59

I wanna put my 5 cents to accepted answer: badałem temat od 2 dni i w końcu znalazłem rozwiązanie, które będę używał zawsze od teraz

Przejdź do punktu 4 w zaakceptowanej odpowiedzi i zapomnij o dodawaniu atrybutów ramek i treści itd

Aby wszystko było automatyczne wystarczy użyć rozwiązania z ten link

Wszystko jest jasne, łatwe, eleganckie i działa jak urok na ios 7. bardzo się cieszę z tego całego lol

 3
Author: jungle_mole,
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-03-07 05:38:25

Zastrzeżenie: - tylko dla ios 9 i powyżej (Widok stosu).

Jeśli używasz aplikacji na urządzeniach z systemem ios 9, użyj widoku stosu . Oto kroki: -
  1. Dodaj widok przewijania z ograniczeniami-pin do lewej, prawej, dołu, góry (bez marginesów) do superview (widok)
  2. Dodaj widok stosu z tymi samymi ograniczeniami do widoku przewijania.
  3. widok stosu inne ograniczenia: - widok stosu.bottom = view.bottom i stackView./ width = " 50%" / szerokość
  4. zacznij dodawać swoje widoki. Widok przewijania zdecyduje się przewijać na podstawie rozmiaru widoku stosu (który jest zasadniczo widokiem zawartości)
 3
Author: DharinS,
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-08-13 10:52:44

Oto proste rozwiązanie.

  1. Ustaw atrybut rozmiar kontrolera widoku w storyboardzie na "Freeform" i ustaw żądany rozmiar. Upewnij się, że jest wystarczająco duży, aby zmieścić pełną zawartość widoku przewijania.

  2. Dodaj widok przewijania i ustaw ograniczenia tak, jak zwykle. jeśli chcesz, aby widok przewijania był wielkości twojego widoku, Dołącz górny, dolny, wiodący i końcowy marginesy do widoku superview tak, jak zwykle would.

  3. Teraz upewnij się, że istnieją ograniczenia w podwidywaniach widoku przewijania, które łączą górę i dół widoku przewijania. To samo dla lewej i prawej strony, jeśli masz poziome przewijanie.

Tutaj wpisz opis obrazka

 3
Author: Hulk_SMASH,
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-29 01:45:29

Oto trochę brudna odpowiedź, która dostaje to samo rozwiązanie dla pionowych widoków przewijania, ale (wbrew etosowi stackoverflow) nie odpowiada na pytanie. Zamiast używać widoku przewijania, po prostu użyj widoku UITableView, przeciągnij normalny widok UIView do nagłówka i zrób go tak duży, jak chcesz, możesz teraz przewijać zawartość w storyboardzie.

 2
Author: TimWhiting,
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-07-08 11:06:37

Najwyraźniej ty nie musisz w ogóle określać wysokości! co jest świetne, jeśli zmienia się z jakiegoś powodu (zmieniasz rozmiar komponentów lub zmieniasz rozmiar czcionki).

Po prostu skorzystałem z tego tutoriala i wszystko działało: http://natashatherobot.com/ios-autolayout-scrollview/

(uwaga: nie ma potrzeby implementowania viewDidLayoutSubviews, chyba że chcesz wyśrodkować Widok, więc lista kroków jest jeszcze krótsza).

Mam nadzieję, że to pomoże!

 0
Author: Lukasz Czerwinski,
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-11-20 01:16:14

Kluczem jest contentSize.

Często tego brakuje i nie jest wskazywany podczas dodawania widoku UIScrollView.

Wybierz UIScrollView i wybierz Inspektora tożsamości.

Dodaj ścieżkę klawiatury contentSize jako size do widoku przewijania w Inspektorze tożsamości i ustaw ją na (320, 1000).

/ Align = "left" /
 0
Author: Alex Zavatone,
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-10-12 17:19:02

Jeśli używasz automatycznego układu, najlepszym rozwiązaniem jest użycie kontrolera UITableViewController ze statycznymi komórkami w storyboard.

Miałem też kiedyś do czynienia z problemem widoku, który wymaga znacznie więcej przewijania, więc zmień UIScrollView z wyżej wymienioną techniką.

 0
Author: Usman Awan,
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-04-30 22:54:57