7

Stworzyłem aplikację opartą na stronie i zhakowałem ją trochę dla niektórych eksperymentów; moim prostym celem jest posiadanie UIPageViewController, którego strony będą zawierały UIViewController trzymający UITableView (po dalszej kontroli wynik mojego eksperymentu jest taki sam, jeśli użyję zamiast tego UITableViewController). Aby to zrobić, ja po prostu stworzony szablon projektu i dodaje UIPageViewController jako osadzonego widzenia RootViewController użyciu ContainerView obiekt Storyboard, tak jak widać na tym screenie:Dlaczego insets zawartości UITableView wewnątrz UIPageViewController się bałagan zaraz po interakcji?

storyboard's controllers

Każdy sterownik jest skonfigurowany za pomocą scenorysu, aby automatycznie dostosować wstawkę zawartości przewijania, a jeśli uruchomię projekt z tą konfiguracją, wszystko będzie wyglądało dobrze, a widok tabeli DataViewController będzie poprawnie dopasowany, zgodnie z oczekiwaniami; Jednak, gdy użytkownik dokonuje interakcji z tableview, że wypustki treści złamać i tableview underlaps paska nawigacji:

content inset issue with uipageviewcontroller and a tableview

udało mi się rozwiązać ten problem poprzez ręczne ustawienie wypustki treści w sposób DataViewController za viewDidLayoutSubview i wyłączając Dostosuj przewijanie widoków na dowolnym kontrolerze, więc nie potrzebuję tego jako odpowiedzi do rozwiązania mojego problemu. Moim pytaniem jest, dlaczego wstawki zawartości są poprawnie ustawione zaraz po pierwszym załadowaniu kontrolera z storyboardu i dlaczego są przerywane po interakcji użytkownika.

Jeśli trzeba przetestować go bezpośrednio, here „sa odnośnik do projektu

Odpowiedz

14

nie jestem w 100% pewien, że to, co używasz do, ale oto niektóre wyjaśnienia dotyczące konfiguracji:

Domyślnie UIViewController s są zwykle skonfigurowane do rozszerzania ich zawartości za nieprzezroczystymi paskami oraz do dostosowywania wstawek widoku przewijania. W konfiguracji powyżej oznacza to, że VC pojemnik:

  • Rozszerza jego zawartość tak, aby pojawić się za pasku nawigacyjnym
  • ustawia jego Scrollview na .contentInset i .scrollIndicatorInsets być taka sama wysokość jak na pasku nawigacyjnym

"Ale, ach!" Słyszałem, jak mówisz: "ten kontroler widoku kontenera nie ma widoku przewijania". Cóż, jest to podstępny bit:

Wygląda na to, że "mój widok przewijania" jest raczej uproszczony, "pierwszy widok przewijania, do którego dochodzę podczas przeszukiwania mojej hierarchii widoków".

UIPageViewController dzieje się zaimplementowane przy użyciu widoku przewijania. Tak więc VC kontenera znajdzie ten widok przewijania i dostosuje jego górne wypustki. To nie jest to, czego naprawdę chcesz; dezorientuje kontroler strony iw pewnym momencie ma tendencję do denerwowania układu.

Proste rozwiązanie polega po prostu na wyłączeniu .automaticallyAdjustsScrollViewInsets dla kontrolera widoku kontenera.

Następnie należy rozwiązać następny problem związany z widokiem tabeli, wymagając pewnego rodzaju górnych wypustek, aby uwzględnić pasek nawigacji. Jak dotąd wydaje mi się, że najlepiej jest to zrobić ręcznie w scenorysie lub w kodzie.

+0

Wow Natknąłem się na ten sam problem i ja go zignorowałem (myślę, że nigdy nie znajdę odpowiedzi, ponieważ popełniłem głupią pomyłkę), ale oto jesteś, zbawco! Dzięki – Starscream

+0

Dziękuję Mike, dokładnie tego potrzebowałem !! –

0

Czy próbowałeś ustalające ograniczenie Auto Układ w widoku kontenera kontrolera widoku głównego w serii ujęć (czyli górna przestrzeń ograniczenie powinno być ustawione w odniesieniu do przewodnika Top Layout, a nie Superview, ze stałą = 0)? Stracisz tylko efekt tabeli Zobacz przewijania pod paskiem nawigacyjnym

+0

Problem polega na tym, że nie mogę stracić tego efektu z powodu des podejmować decyzje. –

+0

I tak, znalazłem sposób, aby to naprawić, mi pytanie brzmi: dlaczego tak się dzieje? –

7

Znaleziony eleganckie rozwiązanie:

  1. z Twojego ujęć, wybierz UIPageViewController
  2. W Inspektorze Atrybuty odznacz opcja ViewController =>Extend Edges =>Under Top Bars
  3. To wszystko, nie dziwne UI hacks
+0

to jest zabójca! Wielkie dzięki – epolyakov

+0

Tak, to było poprawne rozwiązanie dla mnie. Użycie automatycznegoAdjustsScrollViewInsets nie działa. W moim przypadku miałem UIPageViewController wewnątrz kontroler nawigacyjny. UIPageViewController utworzył UICollectionViewController dla każdej strony. Ustawienie automaticAdjustsScrollViewInsets = false spowodowało, że strona została już przesunięta w górę. automaticallyAdjustsScrollViewInsets = true spowodował, że strona przeskoczyła, gdy strona zaczęła przewijać. – blinkmacalahan