Como evitar que o UINavigationBar cubra a parte superior da vista no iOS 7?


99

Depois de atualizar para o Xcode 5, as barras de navegação em todas as visualizações do meu aplicativo diminuíram. Aqui estão algumas capturas de tela, a primeira mostrando tudo na visualização conforme é puxado para baixo e a segunda mostrando tudo intocado. A barra de pesquisa deve começar onde a barra de navegação.

Todo o conteúdo Todo o conteúdo inativo

Alguém sabe como posso consertar isso?

editar: tentei esta recomendação anteriormente:

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

Mas produz resultados muito estranhos.

Tentativa de Solução

Isso pode ser porque eu tenho um "menu de slides" sob este controlador de visualização que está aparecendo devido à transparência da barra de navegação.


Aqui está outra solução para este problema. stackoverflow.com/a/51491645/10148333
Afonso

Respostas:


234

Defina a propriedade translúcida da barra de navegação como NÃO :

self.navigationController.navigationBar.translucent = NO;

Isso corrigirá o enquadramento da visualização abaixo da barra de navegação e da barra de status.

Se você tiver que mostrar e ocultar a barra de navegação, use

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

em seu viewDidLoadmétodo.


1
Eu coloquei isso sob, viewDidLoadno entanto, não produz alterações.
Sam D20

13
torná-lo visível FuntionsDidLayoutSubviews
Hindu

1
Anexar isso a viewDidLayoutSubviews resolveu o problema. Agradeço a ajuda senhores!
Sam D20

Oi, alguma pergunta? ou é um elogio?
Hindu

1
self.edgesForExtendedLayout = UIRectEdgeNone; me ajudou
luky de

32

Por iOS 7padrão, todos os valores da propriedade translúcida do Controlador são SIM, portanto, você define a propriedade translúcida NÃO para esse problema.

self.navController.navigationBar.translucent = NO;

2
Não há propriedade "navController". Use este: self.navigationController.navigationBar.translucent = NO;
Gene Z. Ragan

Eu crio o objeto navigtionbarcontroller no delegado do aplicativo e dou o nome navController.
Sumit Mundra

21

Você pode desativar a opção "Estender bordas" no inspetor de atributos do Controlador de visualização desta tela (conforme mostrado na imagem abaixo):

insira a descrição da imagem aqui


12

Isso funciona para o Swift também no iOS 8.1

navigationController?.navigationBar.translucent = false

8

Se você deseja manter a translucidez em seu navigationBar, no final de seu viewDidLoadou em seu, viewWillAppearadicione esta linha de código:

[self.view sendSubviewToBack:self.tableView]

De alguma forma, se a sua scrollViewsubclasse ( UITableView, UICollectionView, etc.) é a index0 em sua visão atual subviews, ele irá ajustar automaticamente as inserções de acordo com o seu navigationBar. E também não deve afetar sua IU em versões anteriores ao iOS7.


EDITAR Se você inicializar seu UITableViewprogramaticamente, é melhor adicioná-lo à visualização usando este[self.view insertSubview:self.tableView atIndex:0];


Esta deve ser a resposta correta. Se você estiver adicionando a subvisualização programaticamente, pode simplesmente fazer em [self.view insertSubview:self.tableView atIndex:0];vez de enviá-la para trás depois de adicioná-la.
smitt04

Corrigir. Mas sem saber como ele está iniciando seu controlador (programaticamente, construtor de interface), não podemos assumir que é a melhor solução. Embora eu tenha editado minha resposta.
jbouaziz de

Isso funciona, mas parece um hack. Existe algum aviso na documentação oficial sobre isso?
John Tracid

4

Swift 4 :

Defina a seguinte linha de código no método viewDidLoad:

self.navigationController?.navigationBar.isTranslucent = false

3

Você pode adicionar este método em seu controlador de visualização, conforme mostrado neste URL :

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.searchBar.frame = 
    CGRectMake(0, self.topOfViewOffset, self.searchBar.frame.size.width, self.searchBar.frame.size.height);
}

2

Outra abordagem é definir self.automaticallyAdjustsScrollViewInsets = YES;em seu controlador de visualização. Isso é ativado por padrão. Mas no seu caso:

Vejo que você está usando EGORefreshHeaderView. Ele reproduz com contentInset de UITableView. Portanto, ao liberá-lo, o cabeçalho redefinirá a inserção superior em vez de restaurar o valor anterior.


-1

Se você deseja ter controle total sobre as visualizações e evitar ajustes defeituosos do iOS, subclasse UITableView e ajuste as inserções (rolagem e indicadores) em - (void) willMoveToWindow: (UIWindow *) newWindow. Funciona para mim.


-4

Outra opção é abrir seu arquivo Info.plist no modo de código-fonte e inserir as seguintes informações:

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

Espero que isto ajude.


1
Não acho que isso afetaria a vista de forma alguma.
Enrico Susatyo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.