Jak uniemożliwić UINavigationBar zakrywanie widoku z góry w iOS 7?

99

Po aktualizacji do Xcode 5 paski nawigacyjne we wszystkich widokach mojej aplikacji zostały przesunięte w dół. Oto kilka zrzutów ekranu, pierwszy pokazujący wszystko w widoku, gdy jest on rozebrany, a drugi pokazujący wszystko nietknięte. Pasek wyszukiwania powinien zaczynać się w miejscu paska nawigacji.

Cała zawartość Cała zawartość w stanie bezczynności

Czy ktoś wie, jak mogę to naprawić?

edycja: próbowałem tego wcześniej zalecenie:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

Ale daje to bardzo dziwne wyniki.

Próba rozwiązania

Może to być spowodowane tym, że pod tym kontrolerem widoku mam „menu przesuwne”, które pojawia się z powodu przezroczystości paska nawigacji.

Sam D20
źródło
Oto inne rozwiązanie tego problemu. stackoverflow.com/a/51491645/10148333
Afonso

Odpowiedzi:

235

Ustaw przezroczystą właściwość paska nawigacji na NIE :

self.navigationController.navigationBar.translucent = NO;

Spowoduje to usunięcie ramki widoku pod paskiem nawigacji i paskiem stanu.

Jeśli musisz pokazać i ukryć pasek nawigacji, użyj

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific

w swojej viewDidLoadmetodzie.

Głębokie
źródło
1
Umieściłem to poniżej, viewDidLoadale nie przynosi to żadnych zmian.
Sam D20
13
make it in viewDidLayoutSubviews funtions
Hindu
1
Dołączenie tego do viewDidLayoutSubviews załatwiło sprawę. Doceniam pomoc panów!
Sam D20
Cześć, jakieś pytanie? czy to komplement?
Hindu,
1
self.edgesForExtendedLayout = UIRectEdgeNone; pomogło mi
luky
32

W iOS 7przy domyślnych cała właściwość półprzezroczystości kontrolera ma wartość TAK, dlatego ustawiono właściwość przezroczystości NIE dla tego problemu.

self.navController.navigationBar.translucent = NO;
Sumit Mundra
źródło
2
Brak właściwości „navController”. Użyj tego: self.navigationController.navigationBar.translucent = NO;
Gene Z. Ragan
tworzę obiekt navigtionbarcontroller w delegacie aplikacji i nadaję nazwę navController.
Sumit Mundra
21

Możesz wyłączyć "Rozszerz krawędzie" w Inspektorze atrybutów kontrolera widoku tego ekranu (jak pokazano na poniższym obrazku):

wprowadź opis obrazu tutaj

Achyut Sagar
źródło
12

Działa to również szybko na iOS 8.1

navigationController?.navigationBar.translucent = false
uplearnedu.com
źródło
8

Jeśli chcesz zachować przezroczystość na swoim navigationBar, na końcu swojego viewDidLoadlub w swoim, viewWillAppeardodaj następujący wiersz kodu:

[self.view sendSubviewToBack:self.tableView]

W jakiś sposób, jeśli twoja scrollViewpodklasa ( UITableView, UICollectionViewitp.) Jest na index0 w twoim bieżącym widoku subviews, automatycznie dostosuje wstawki zgodnie z twoim navigationBar. Nie powinno też wpływać na interfejs użytkownika w wersjach wcześniejszych niż iOS7.


EDYCJA Jeśli inicjalizujesz UITableViewprogramowo, najlepiej jest dodać go do widoku za pomocą tego[self.view insertSubview:self.tableView atIndex:0];

jbouaziz
źródło
To powinna być prawidłowa odpowiedź. Jeśli dodajesz widok podrzędny programowo, możesz po prostu zrobić to [self.view insertSubview:self.tableView atIndex:0];zamiast wysyłać go na koniec po dodaniu.
smitt04
Poprawny. Ale nie wiedząc, w jaki sposób inicjuje swój kontroler (programistycznie, konstruktor interfejsu), nie możemy założyć, że jest to najlepsze rozwiązanie. Chociaż zredagowałem odpowiedź.
jbouaziz
To działa, ale wygląda na włamanie. Czy jest jakaś wzmianka w oficjalnej dokumentacji na ten temat?
John Tracid,
4

Swift 4 :

Ustaw następujący wiersz kodu w metodzie viewDidLoad:

self.navigationController?.navigationBar.isTranslucent = false
Md. Najmul Hasan
źródło
3

Możesz dodać tę metodę do kontrolera widoku, jak pokazano na tym adresie URL :

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.searchBar.frame = 
    CGRectMake(0, self.topOfViewOffset, self.searchBar.frame.size.width, self.searchBar.frame.size.height);
}
malkoty
źródło
2

Innym podejściem jest ustawienie self.automaticallyAdjustsScrollViewInsets = YES;na kontrolerze widoku. Jest to domyślnie włączone. Ale w twoim przypadku:

Widzę, że używasz EGORefreshHeaderView. Odgrywa z contentInset z UITableView. Więc kiedy go zwolnisz, nagłówek zresetuje górną wstawkę zamiast przywracać poprzednią wartość.

Krivoblotsky
źródło
-1

Jeśli chcesz mieć pełną kontrolę nad widokami i uniknąć błędnych dostosowań systemu iOS, podklasę UITableView i dostosuj wstawki (zarówno przewijanie, jak i wskaźniki) w - (void) willMoveToWindow: (UIWindow *) newWindow. Pracuje dla mnie.

Farhad Malekpour
źródło
-4

Inną opcją jest otwarcie pliku Info.plist w trybie kodu źródłowego i wprowadzenie następujących informacji:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarHidden</key>
<true/>

Mam nadzieję że to pomoże.

Nicoli
źródło
1
Nie sądzę, żeby to w ogóle wpłynęło na widok.
Enrico Susatyo,