ios - sumiu - barra vermelha iphone




Barra de status e barra de navegação aparecem sobre os limites da minha visualização no iOS 7 (14)

Recentemente baixei o Xcode 5 DP para testar meus aplicativos no iOS 7. A primeira coisa que notei e confirmei é que os limites da 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 visã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 eu poderia explicar a altura, obtendo a altura da tela principal, subtraindo a altura da barra de status e a altura da barra de navegação, mas isso parece um trabalho extra desnecessário.

Como posso corrigir esse problema?

Atualizar:

Eu encontrei uma solução para esse problema específico. Defina a propriedade translúcida da barra de navegação para NO:

self.navigationController.navigationBar.translucent = NO;

Isso determinará que a visualização seja enquadrada sob a barra de navegação e a barra de status.

No entanto, não encontrei uma correçã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 cheia, desejo ter a barra de navegação translúcida e a vista ser enquadrada abaixo dela. Isso funciona, mas quando eu alterno mostrando / escondendo a barra de navegação, tenho resultados ainda mais estranhos. A primeira subvisualização (um UIScrollView) obtém seus limites e a origem é alterada a cada vez.


Adicione a chave "Exibir a aparência da barra de status baseada no controlador" na lista suspensa como uma linha em info.plist . Algo assim:


Em seu arquivo plist de aplicativos, adicione uma linha, chame de "Exibir aparência da barra de status baseada em controlador" e defina-a como NÃO .


Eu criei minha visão programaticamente e isso acabou funcionando para mim:

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}

Source (na seção topLayoutGuide na parte inferior da página 37).


Eu gostaria de expandir a resposta do Stunner e adicionar uma instrução if para verificar se é o iOS-7, porque quando eu testei no iOS 6 meu aplicativo falhava.

A adição estaria adicionando:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)

Então sugiro adicionar este método ao seu arquivo MyViewControler.m :

- (void) viewDidLayoutSubviews {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
    }
}

Eu tive o mesmo problema com o meu aplicativo por iPads (armv7, armv7s, amr64) apenas apresentando outro UIViewController e depois de descartá-los vai barra de navegação na barra de status ... Eu gasto muito tempo para encontrar qualquer solução para isso. Eu estou usando o storyboard e no InterfaceBuilder para UIViewController que faz terrível eu definir Presentation from FullScreen -> Current Context e corrigir esse problema. Ele funciona no meu aplicativo apenas para iPads => iOS8.0 (teste com iOS8.1) e para iPads com iOS 7.1 não funcionam !!


No meu caso, ter loadView () interrompido
este código: self.edgesForExtendedLayout = UIRectEdgeNone

mas depois de excluir loadView () tudo funcionou bem


Para mim, a solução mais simples é adicionar duas chaves no plist


Se você quer que a view tenha a barra de navegação translúcida (que é legal), você precisa configurar um contentInset ou similar.

Aqui está como eu faço:

// Check if we are running on ios7
if([[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."][0] intValue] >= 7) {
      CGRect statusBarViewRect = [[UIApplication sharedApplication] statusBarFrame];
      float heightPadding = statusBarViewRect.size.height+self.navigationController.navigationBar.frame.size.height;

      myContentView.contentInset = UIEdgeInsetsMake(heightPadding, 0.0, 0.0, 0.0);
}

Solução rápida:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.edgesForExtendedLayout = UIRectEdge.None
}

Swift 4.2 - Xcode 10.0 - iOS 12.0:

if #available(iOS 11.0, *) {} else {
  self.edgesForExtendedLayout = []
  self.navigationController?.view.backgroundColor = .white
}

Você pode conseguir isso implementando uma nova propriedade chamada edgesForExtendedLayout no iOS7 SDK. Por favor, adicione o seguinte código para conseguir isso,

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

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

O iOS 7 traz várias alterações em como você configura e personaliza a aparência da sua interface do usuário . As alterações no layout do controlador de visualização, na cor da tinta e na fonte afetam todos os objetos UIKit no seu aplicativo. Além disso, os aprimoramentos nas APIs do reconhecedor de gestos proporcionam a você um controle mais refinado sobre interações de gestos.

Usando controladores de exibição

No iOS 7, os controladores de visualização usam o layout de tela inteira. Ao mesmo tempo, o iOS 7 oferece um controle mais granular sobre a maneira como um controlador de exibição exibe suas visualizações. Em particular, o conceito de layout de tela inteira foi refinado para permitir que um controlador de visualização especifique o layout de cada borda de sua visualização.

A propriedade do controlador de visualização wantsFullScreenLayout foi descontinuada no iOS 7. Se você atualmente especificar wantsFullScreenLayout = NO , o controlador de exibição poderá exibir seu conteúdo em um local de tela inesperado quando for executado no iOS 7.

Para ajustar como um controlador de exibição mostra suas visualizações, o UIViewController fornece as seguintes propriedades:

  • edgesForExtendedLayout

A propriedade edgesForExtendedLayout usa o tipo UIRectEdge , que especifica cada uma das quatro bordas do retângulo, além de especificar none e all. Use edgesForExtendedLayout para especificar quais arestas de uma vista devem ser estendidas, independentemente da barra de translucidez. Por padrão, o valor dessa propriedade é UIRectEdgeAll .

  • extendedLayoutIncludesOpaqueBars

Se seu design usar barras opacas, refine edgesForExtendedLayout definindo também a propriedade extendedLayoutIncludesOpaqueBars como NO . (O valor padrão de extendedLayoutIncludesOpaqueBars é NO .)

  • AutomaticAdjustsScrollViewInsets

Se você não quiser que os inserts de conteúdo da visualização de rolagem sejam ajustados automaticamente, automaticallyAdjustsScrollViewInsets como NO automaticallyAdjustsScrollViewInsets . (O valor padrão de automaticallyAdjustsScrollViewInsets é YES .)

  • topLayoutGuide, bottomLayoutGuide

As propriedades bottomLayoutGuide e bottomLayoutGuide indicam a localização das arestas da barra superior ou inferior na exibição de um controlador de exibição. Se as barras devem se sobrepor à parte superior ou inferior de uma vista, você pode usar o Interface Builder para posicionar a vista relativa à barra, criando restrições para a parte inferior do topLayoutGuide ou para o início do bottomLayoutGuide. (Se nenhuma barra deve sobrepor a vista, a parte inferior do topLayoutGuide é a mesma que a parte superior da vista e a parte superior do bottomLayoutGuide é a mesma que a parte inferior da vista.) Ambas as propriedades são criadas preguiçosamente quando solicitadas.

Por favor se refira, doc de maçã


basta definir o seguinte código na exibição será exibida.

  if ([[[UIDevice currentDevice] systemVersion] floatValue]<= 7) {
self.edgesForExtendedLayout = UIRectEdgeNone;
 }

edgesForExtendedLayout faz o truque para o iOS 7. No entanto, se você criar o aplicativo no SDK do iOS 7 e implantá-lo no iOS 6, a barra de navegação será exibida translúcida e as exibições ficarão abaixo dela. Então, para consertá-lo tanto no iOS 7 quanto no iOS 6, faça o seguinte:

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

Swift 3

override func viewWillAppear(_ animated: Bool) {
    self.edgesForExtendedLayout = []
}




ios7