2016-08-15 28 views
8

Oto krótkie pytanie dotyczące czegoś, co działa, ale może być napisane o wiele lepiej. Mam UIScrollView i listę obiektów ułożonych wewnątrz, jedną pod drugą. Wszystko odbywa się podczas viewDidLoad(), a rozmieszczenie obiektów używa Auto Layout. Oto, co robię, aby ustawić wartość contentSize wysokości UIScrollView na odpowiednią wartość.Obliczanie zawartościRozmiar dla UIScrollView podczas korzystania z automatycznego układu

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    globalView.contentSize = CGSize(width: globalView.frame.width, 
            height: globalView.frame.height * 1.59) 
} 

Działa, ale arbitralna wartość 1.59 została oczywiście podjęta przeze mnie, próbując kilku możliwych wartości. Jaki jest właściwy sposób obliczenia zawartości w takim przypadku? Robię wszystko programowo. Wyszukiwanie w sieci nie doprowadziło mnie do żadnej prostej i jasnej odpowiedzi, więc chociaż może to być nieco duplikatem pytanie, postanowiłem przeformułować to.

+0

Można znaleźć wiele odpowiedzi na ten sam temat o ustawienie ograniczenia do UIScrollView. Jeśli ustawisz więzy poprawnie dla całego komponentu wewnątrz UIScrollView, wtedy nie będziesz musiał programowo ustawiać stałego rozmiaru. Zobacz ten link wyjaśniając to samo - http://stackoverflow.com/questions/35624873/ios-scrollview-needs-constraint-for-y-position-or-height/35625897#35625897 –

+0

Prawda, ale większość (wszystkie) z nich zakłada używasz storyboardu :) – Michel

Odpowiedz

46

Podawanie programu o rozmiarach nie jest dobrym pomysłem. Poniższe rozwiązanie, które będzie pracy przy użyciu autolayout, w ogóle nie musi ustawiać rozmiaru zawartości. Obliczy on, jak do liczby wyświetlanych pól interfejsu użytkownika zostanie dodanych .

Krok 1:

Dodaj Scrollview aby zobaczyć w serii ujęć i dodać początku, na końcu górne i dolne ograniczenia (wszystkie wartości są równe zeru).

Krok 2:

Nie dodawać bezpośrednio widoki, które trzeba na bezpośrednio Scrollview, Pierwszy dodać jeden widok do Scrollview (to będzie nasz widok zawartości dla wszystkich elementów interfejsu użytkownika). Dodaj poniżej ograniczenia do tego widoku.

1) Ograniczenia wiodące, końcowe, górne i dolne (Wszystkie wartości wynoszą zero).

2) Dodaj równą wysokość, równą szerokość do widoku głównego (tzn. Zawierającego scrollview). Dla tej samej wysokości ustaw priorytet na niski. (Jest to ważny krok do ustawienia rozmiaru zawartości).

3) Wysokość tego widoku zawartości będzie zgodna z liczbą widoków dodanych do widoku. powiedzmy jeśli dodano ostatni pogląd jest jedna etykieta i jego pozycja Y jest 420 i wysokość wynosi 20 wówczas widok zawartość będzie 440.

Krok 3: Dodaj ograniczeń do wszystkich poglądów, które zostały dodane w treści zobacz zgodnie z wymaganiami.

Dla porównania:

enter image description here

enter image description here

Mam nadzieję, że będzie to na pewno pomoże.

+0

To brzmi interesująco, ale ponieważ nie używam storyboardu. Muszę zobaczyć, jak zastosować te wyjaśnienia podczas pracy programowej. Pierwsze pytanie brzmi: w kroku 2, jak ustawić widok jako widok treści? – Michel

+0

Jego normalny widok, dodałem do scrollview (traktując jako contentView). Następnie w tym widoku umieszczam wszystkie elementy interfejsu użytkownika. –

+1

W końcu to zrobiłem, działa programowo, tak jak chcę. Ale nadal nie jestem pewien, jak działa ten materiał. Co się stanie, jeśli dodaję 3 subviews o różnej wysokości? Który z nich będzie uważany za widok treści? – Michel

1

Chociaż w końcu udało mi się rozwiązać ten problem i sprawić, by wszystko działało. Zauważyłem, że wszystko, co mogłem znaleźć w sieci jako powiązane odpowiedzi, zostało skierowane do użytkowników storyboardów. Ale nic, co można zrobić programowo, że mogę położyć ręce.

Postanowiłem więc stworzyć bardzo prostą aplikację demonstracyjną, aby pokazać, jak można to osiągnąć. Mam nadzieję, że przyda się komuś w pewnym momencie.

Oto adres, aby ją na GitHub: https://github.com/zaxonus/AutoLayScroll

+0

Ten przykład został stworzony, aby pokazać, jak zrobić wszystko programowo. Jeśli chcesz używać XIB (storyboardu), istnieje wiele przykładów w sieci. Pierwszym z nich jest wspomniany powyżej, w przyjętej odpowiedzi. – Michel

+0

To jest doskonałe. Kilka dni próbowania rzeczy i to jest jedyne, które działało. Uwaga, działa w Swift 3, biorąc pod uwagę zmianę nazwy zmiennej. Dziękuję Panu. – mike