IOS7: przesunięcie uiscrollview w UINavigationController

Obecnie migruję moją aplikację na ios 7 i utknąłem przez wiele godzin na nowym navigationcontroller / bar management.

Wcześniej, kiedy mieliśmy Kontroler nawigacyjny, mieliśmy taki fragment:

UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:[[MainViewController alloc]init]];

W interface builder mieliśmy wybór, aby ustawić istniejący pasek nawigacyjny dla widoku i wszystko pasowało do zawartości rzeczywistego widoku.

OK więc teraz nie mam pojęcia jak poprawnie zaprojektować interfejs builder. Nadal mam swój fragment, aby zainicjować mój navcontroller. Jednak w kreatorze interfejsów dla mojego kontrolera MainViewController jeśli ustawiłem pasek stanu na półprzezroczysty lub nieprzezroczysty pasek nawigacyjny, mam przesunięcie 44px na górze(patrz poniżej).


Interface Builder_________________________i wynik


Teraz, jeśli ustawiłem pasek stanu na brak, nie ma przesunięcia na górze, ale ponieważ Widok na symulatorze jest mniejszy z powodu paska nawigacji, dół widoku w Interface builder jest wycięty wyłącz.

Interface Builder_________________________i wynik

Myślę, że naprawdę czegoś tu brakuje, ale nie mogę znaleźć żadnego tematu lub informacji o apple w Przewodniku iOS7 Transitions na ten temat.

Dzięki za pomoc


EDIT

Jak widać na zdjęciach, pierwszym potomkiem widoku jest UIScrollView, który zawiera obie etykiety, problem nie pojawia się, gdy nie ma widoku przewijania. Pojawia się również jeśli to UITableView. Jeśli etykieta znajduje się poza UIScrollView, nie ma przesunięcia tej etykiety.

Author: Martijn Pieters, 2013-09-24

8 answers

OK więc znalazłem rozwiązanie, ustawiłem w kontrolerze właściwość:

self.automaticallyAdjustsScrollViewInsets = false

Nie bardzo rozumiem prawdziwą zaletę tej właściwości, chociaż, (lub dlaczego wartość domyślna jest true)

Jedyną dokumentacją jaką znalazłem była tam:

Update

W iOS 11 automaticallyAdjustsScrollViewInsets jest przestarzały

Powinieneś teraz użyć:

self.tableView.contentInsetAdjustmentBehavior = .never
Zachęcam również do sprawdzenia to pytanie i jego odpowiedź, aby lepiej zrozumieć te właściwości
 284
Author: streem,
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-09-29 16:10:10

@ Justafinger odpowiedź działa jak urok dla mnie, jak również.

Chciałem tylko dodać, że to ustawienie można również łatwo dostosować z Buildera interfejsu.

  1. Wybierz kontroler widoku
  2. Kliknij kartę "Inspektor atrybutów"
  3. Usuń Zaznaczenie 'Dostosuj Wstawianie Widoku Przewijania'
  4. Smacznego!

Tutaj wpisz opis obrazka

 92
Author: Myxtic,
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-10-25 21:05:49

Natknąłem się na ten sam problem, ale znalazłem dość dziwną właściwość na ViewController w interface builder, która wydaje się być przyczyną tego dla mnie. Istnieje zestaw pól wyboru "Rozszerz krawędzie". Usunąłem czek "Pod Top Bars" i wszystko zaczęło układać się prawidłowo dla mnie.

 11
Author: Ben Nicholas,
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-04-29 19:27:41

Z automaticallyAdjustsScrollViewInsets ustawionym na YES (ustawienie domyślne) występuje niedopasowanie w pozycjonowaniu scrollview między ios6 i ios7, więc aby były spójne, należy wyłączyć to ustawienie. Jednak ios6 ulegnie awarii, jeśli natknie się na automatically adjustsscrollviewinsets, więc albo musisz uzależnić programową zmianę automatically adjustsscrollviewinsets od ios7, albo wyłączyć opcję za pomocą storyboard / NIB

 2
Author: dawid,
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-02-15 07:32:20

Miałem podobny problem, po odrzuceniu kontrolera viewController, contentOffset z mojego tableView został zmieniony na (0, -64).

Moje rozwiązanie było trochę dziwne, próbowałem wszystkich innych odpowiedzi, ale nie odniosłem sukcesu, jedyną rzeczą, która naprawiła mój problem było przełączenie pozycji tableView w drzewie kontrolek .xib

Była to pierwsza kontrolka w widoku nadrzędnym w ten sposób:

przed

Przeniosłem tableView zaraz po ImageView i to "przepracowany": {]}

po

Wydaje się, że umieszczenie widoku tabeli na pierwszej pozycji powodowało problem, a przesunięcie widoku tabeli na inną pozycję rozwiązało problem.

P. D. nie używam autoLayout ani storyboardów

Mam nadzieję, że to może komuś pomóc!

 2
Author: Chuy47,
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-04-11 20:22:25

Ja również mam do czynienia z tym problemem.

UIScrollView Rozmiar zawartości jest obliczany przez OS jako inne rozmiary, pochodzenie dostarczane przez system ograniczeń - dlatego OS ma wątpliwość.

Jak naprawić - powinieneś jawnie zdefiniować rozmiar zawartości UIScrollView:

  1. Embed scrollable content to UIView (zmieniam nazwę na ContentView)
  2. Dodaj ograniczenia:

ContentView.Weight = View.Weight i ContentView.Height = View.Height

Tutaj wpisz opis obrazka

 1
Author: maslovsa,
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-25 09:57:04

Wydaje się, że rozwiązaniem obejścia jest wyświetlenie pliku storyboard jako "iOS 6.1 i wcześniejsze" (wybierz plik storyboard - > Inspektor plików->dokument Buildera interfejsu- > Zobacz jako. Pozycjonowanie podwidywań w tym trybie pokazuje przesunięcie.

 0
Author: swhitman,
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-09-23 20:27:43

Dziękuję wam za rozwiązania! Godzinami starałem się rozwiązać problem. Wszystko było ok, gdy nie było paska nawigacyjnego zaangażowanych, ale poszło siwire w momencie, gdy osadzony ViewController w NavigationController.

Rozwiązałem to, odznaczając Dopasuj Wstawki widoku przewijania i pod górnym paskiem . Oba znajdują się w Inspektorze atrybutu ViewController. Wielkie dzięki!

 0
Author: Jackson Gan,
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-12-10 07:11:23