A barra de navegação aparece sobre as visualizações com o novo iOS7 SDK

113
CGRect cgRect1 = [[UIScreen mainScreen] applicationFrame];


UISearchBar  *mySearchBar = [[UISearchBar alloc] 
               initWithFrame:CGRectMake(0, 0, cgRect.size.width, 40)];

mySearchBar.autoresizingMask = 
              UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight ;


UITableView  *myTableView = [[UITableView alloc] 
     initWithFrame:CGRectMake(0, 40, cgRect.size.width, cgRect.size.height-40)];

myTableView.autoresizingMask = 
               UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;


[self.view addSubview:mySearchBar];
[self.view addSubview:myTableView];

Nas versões anteriores, ele está funcionando corretamente. A barra de pesquisa está aparecendo abaixo da statusbarbarra de navegação e. O tableviewestá aparecendo abaixo da barra de pesquisa

Mas quando eu executo isso Xcode 5 sdk iOS 7, a barra de pesquisa não fica visível (acho que está localizada abaixo da barra de status e da barra de navegação), e também a barra de navegação está aparecendo sobre a visualização da tabela.

Será corrigido com iOS 7uma versão estável?

Ou é o problema da minha codificação?

Ou devemos lidar com isso adicionando o (y = statubar height + nav bar height)valor de y para iOS 7?

Recentemente baixei o Xcode 5 DP para testar meus aplicativos no iOS 7. A primeira coisa que notei e confirmei é que os limites de minha visualização nem sempre são redimensionados para levar em conta a barra de status e a barra de navegação.

Em viewDidLayoutSubviews, imprimo os limites da visualização:

{{0, 0}, {320, 568}}

Isso faz com que meu conteúdo apareça abaixo da barra de navegação e da barra de status.

Eu sei que poderia contabilizar a altura sozinho obtendo a altura da tela principal, subtraindo a altura da barra de status e da barra de navegação, mas isso parece um trabalho extra desnecessário.

Alguém mais experimentou esse problema?

ATUALIZAR:

Eu encontrei uma solução para este problema específico. 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.

No entanto, não encontrei uma solução para o caso em que você deseja que a barra de navegação seja translúcida. Por exemplo, ao visualizar uma foto em tela inteira, desejo que a barra de navegação seja translúcida e a visualização emoldurada abaixo dela. Isso funciona, mas quando alterno para mostrar / ocultar a barra de navegação, tenho resultados ainda mais estranhos. A primeira subvisualização (a UIScrollView) obtém seus limites y origem alterada a cada vez.


fonte
4
Software beta. Os fóruns de desenvolvedores da Apple são mais apropriados. Além disso, o problema é mencionado explicitamente no guia de transição.
Sulthan de

Respostas:

188

Isso não é totalmente verdade. Houve uma nova propriedade introduzida no iOS 7 que permite ajustar o comportamento do layout como nas versões anteriores do iOS. Coloque este pedaço de código em seu controlador de visualização e você estará pronto para começar! O espaço que sua barra de navegação ocupa deve ser contabilizado automaticamente

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

Você precisa adicionar o acima em seu -(void)viewDidLoadmétodo.

Nota: Você deve estar usando a versão GM mais recente do iOS 7 e Xcode 5 agora, uma vez que a API mudou das versões beta.

Tripulação de um homem
fonte
em Meu código, diz edgeForExtendedLayout. Uso de identificador não declarado UIExtendedEdgeNone. Por favor ajude.
6
Foi alterado para UIRectEdgeNone
Simon
6
Essa é exatamente a razão pela qual tal pergunta não deve ser feita ou respondida aqui.
Sulthan de
Eu não entendo porque, se você quiser manter a compatibilidade com ios6, você é forçado a introduzir um caso condicional por código para verificar se o controlador tem essa propriedade ou não ..
jerrygdm
12
Isso só parece funcionar se a visualização estiver incorporada em um UINavigationController.
pojo
37

Captura de tela do storyboard

Se você está trabalhando no Storyboard (o que eu recomendo fortemente!), Esta é a solução: Você pode desabilitar "Extend Edges" do seu ViewController no storyboard. Você tem que fazer isso para cada viewController. Você pode desativar as bordas estendidas clicando no ícone viewController no stortyboard (ao lado do productOwner abaixo da própria visualização) e selecionando o inspetor de atributos (como as imagens mostram).

Isso também definirá as linhas de alinhamento, como iOS 6.

Outra ótima ferramenta no xCode 5 é "Preview": clique no botão do mordomo (editor assistente) e selecione Preview. lá, você pode selecionar iOS 6 e ver como ficará o design do storyboard no iOS 6.

É simplesmente ótimo: D

[Atualizar]

Tenha cuidado: desabilitar "Estender Bordas" pode resultar em um brilho preto na barra de navegação quando o aplicativo entra em segundo plano no iOS7. o brilho também ficará visível na visualização multitarefa (pressione duas vezes o botão home). isso pode ser resolvido definindo a cor de fundo da visualização da barra de navegação como branco.

[self.navigationController.view setBackgroundColor:[UIColor whiteColor]];
MQoder
fonte
Sim, esta é a solução que vem de uma perspectiva de storyboard. Obrigado.
jpittman
12

Como diz o OP, existe uma solução simples para isso que é definir a barra de navegação como opaca. Em vez de fazer isso no código, basta desmarcar "Translúcido" para sua barra de navegação raiz:

insira a descrição da imagem aqui

Licitações
fonte
8

self.edgesForExtendedLayout=UIRectEdgeNone;

Funciona no simulador iOS 7 (Xcode 5 DP5)

yhlin
fonte
2
isso funciona bem no ios7, mas se eu executei o aplicativo no ios 6 e em versões anteriores, as visualizações aumentam. Alguma solução para isso ?. Além disso, precisamos definir essa propriedade em cada método de carregamento viewdid do controlador de visualização?
loganathan
você sempre pode verificar se o iOS atual é 7 com este se:if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
Aviel Gross de
2

essas respostas foram úteis, especialmente MQoder, mas para mim também tive que definir a barra superior padrão para "navegação em preto opaco".

insira a descrição da imagem aqui

Jasonpurdy
fonte
1

A resposta de @One Man Crew está correta, mas:

Eu recomendaria usar este código para evitar erros ao executar o aplicativo em versões mais antigas:

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
     if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
 #endif
Yossi
fonte
0

self.edgesForExtendedLayout = UIRectEdgeNone;

E você precisa fazer isso em AppDelegate # application: didFinishLaunchingWithOptions:

self.window.backgroundColor = [UIColor whiteColor];

Caso contrário, a cor de fundo da barra de navegação mudará para cinza. Porque a barra de navegação transparente se sobrepõe à janela.

EIMEI
fonte
0

Se você deseja manter a transparência quando o usuário rola a visualização da sua tabela, você pode definir o contentInset dela:

CGFloat topLayoutGuide = self.topLayoutGuide.length + self.tabBarController.navigationController.navigationBar.frame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);
Enrico Susatyo
fonte
-1

Uma solução é usar o Navigation Controller. Isso resolve o problema automaticamente. Use também o Xcode 5 em vez das versões do Xcode Preview, uma vez que são beta.

Jayprakash Dubey
fonte