iOS 7: UITableView mostra na barra de status

219

A primeira tela do meu aplicativo é UITableViewControllersem barra de navegação, o que significa que o conteúdo flui sob a barra de status, para que haja muitas colisões de texto. Eu ajustei as duas propriedades Under top barse as Adjust scroll view insetsquais na verdade impedem a rolagem para baixo, mas com o custo de manter a parte superior da exibição da tabela em baixo. Tentei definir o UITableViewquadro para compensar 20 pixels, mas ele não parece entrar em vigor e, como atualmente preciso do aplicativo para ser compatível com o iOS 6, não posso pular para o iOS 7 Storyboards para forçar o uso do AutoLayout o guia de altura superior. Alguém encontrou uma solução que funcione para as duas versões?

Coisas que eu tentei: definir edgesForExtendedLayout, alterar as configurações no Storyboard para Under top barse Adjust scroll viewforçar o quadro para uma nova área.

Uma imagem vale mais que mil palavras: Fluxo da barra de status em

Nicholas Smith
fonte
2
Uma forma de contornar rápida poderia ser a de adicionar um em branco cabeçalho 20-pixel para a mesa quando rodando em iOS 7.
Erics
@ Eric: Eu já tenho um UITableViewcabeçalho lá, ele também flui sob a barra de status.
Nicholas Smith
Por que não usar o guia de layout automático no iOS 6? Funciona.
9133 Steven Fisher

Respostas:

366

Para qualquer pessoa interessada em replicar isso, basta seguir estas etapas:

  1. Crie um novo projeto iOS
  2. Abra o storyboard principal e exclua o padrão / inicial UIViewController
  3. Arraste um novo UITableViewControllerda Biblioteca de objetos
  4. Defina-o como o controlador de visualização inicial
  5. Alimente a tabela com alguns dados de teste

Se você seguir as etapas acima, ao executar o aplicativo, verá que nada, incluindo ajustar as caixas de seleção do Xcode para "Estender arestas sob as barras {superior, inferior e opaca}", impede que a primeira linha apareça na barra de status, nem você pode resolver isso programaticamente.

Por exemplo, no cenário acima, o seguinte terá nenhum efeito:

// These do not work
self.edgesForExtendedLayout=UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars=NO;
self.automaticallyAdjustsScrollViewInsets=NO;

Esse problema pode ser muito frustrante, e acredito que seja um bug no final da Apple, especialmente porque aparece em seus próprios cabos UITableViewControllerda biblioteca de objetos.

Eu discordo de todos que estão tentando resolver isso usando qualquer forma de "Números mágicos", por exemplo, "use um delta de 20px". Esse tipo de programação fortemente acoplada definitivamente não é o que a Apple quer que façamos aqui.

Eu descobri duas soluções para esse problema:

  • Preservando a UITableViewControllercena da cena :
    se você deseja manter o UITableViewControllerstoryboard, sem colocá-lo manualmente em outra exibição, é possível incorporá-lo UITableViewControllerem UINavigationController(Editor> Incorporar> Navegador) e desmarcar a opção "Mostra barra de navegação" no inspetor . Isso resolve o problema sem precisar de ajustes extras, além de preservar a UITableViewControllercena da sua pessoa no storyboard.

  • Usando o AutoLayout e incorporando-o UITableViewa outra visualização (acredito que é assim que a Apple deseja que façamos isso) :
    crie um vazio UIViewControllere arraste UITableView-o. Em seguida, pressione Ctrl e arraste do seu UITableViewpara a barra de status. Quando o mouse chegar à parte inferior da barra de status, você verá um balão de Autolayout que diz "Guia de layout superior". Solte o mouse e escolha "Espaçamento vertical". Isso informará o sistema de layout para colocá-lo logo abaixo da barra de status.

Eu testei nos dois sentidos em um aplicativo vazio e ambos funcionam. Você pode precisar fazer alguns ajustes extras para fazê-los funcionar no seu projeto.

marinosb
fonte
5
Para sua informação, a opção 1 (incorporação em um controlador nav) faz com que as células fiquem visíveis atrás da barra de status translúcida quando você rolar pela tabela.
precisa saber é o seguinte
4
@RyanR Notei isso também, mas acho que está tudo bem em algum momento. A Apple fez o mesmo na visualização de guias abertas do Safari para dispositivos móveis, as guias serão exibidas embaixo da barra de status. A solução do controlador de navegação é a solução mais simples, eu torço por ela. No entanto, a barra de status translúcida é uma ideia estúpida.
Pride Chung,
6
Quando pressiono a tecla Ctrl para cima, nunca corro para a barra de status. Não há nenhuma barra de status visíveis na vista, não tenho certeza que você quer dizer aqui ...
Jesse
4
A opção 2 não funciona mais no Xcode 5. A ação descrita (arraste com a tecla Ctrl) nunca deve ter funcionado, pois pertence ao sistema Outlets, mas mesmo se você arrastar manualmente para a Scene Tree à esquerda, o guia de layout superior NÃO FUNCIONA (ele deve fazer, AFAICT - Eu acredito que este é mais um erro grave na AutoLayout :( :()
Adam
3
@PrideChung parece estúpido quando se utiliza um cabeçalho com o tableview, as estadias cabeçalho fixo no topo e os elementos desaparecerá por trás - e reapear atrás da barra de status transparente ...
Ixx
86

Se você estiver fazendo as coisas de maneira programática e usando uma UITableViewControllersem a UINavigationControllersua melhor aposta, faça o seguinte em viewDidLoad:

Swift 3

self.tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)

Swift anterior

self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);

A UITableViewControllerbarra de rolagem ainda ficará atrás da barra de status, mas não ficará embaixo dela quando rolada para cima.

lipka
fonte
1
Você pode adicionar uma verificação da versão do sistema operacional> 7 e também oferecer suporte a sistemas operacionais mais antigos (sem inserção para eles). Caso contrário, isso funcionou bem para os meus propósitos.
precisa saber é o seguinte
8
O valor da altura codificada não é a melhor ideia.
Maciej Kozieł 23/09/14
3
Sim, use topLayoutGuidecomprimento.
Lipka
10
Eu usaria UIApplication.sharedApplication.statusBarFrame.size.heightem vez de 20.
mojubá
Atualmente, isso é atualizado para UIApplication.shared.statusBarFrame.size.height.
precisa saber é o seguinte
23

Observe: Isso funcionou para mim na seguinte configuração:

  • Nenhuma barra de navegação na parte superior da tela (a exibição da tabela atende à barra de status)
  • A exibição de tabela não pode ser rolada

Se os dois requisitos acima não forem atendidos, sua milhagem poderá variar.

Correio Original

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;
    }
}

Origem (na seção topLayoutGuide na parte inferior da página 39).

Stunner
fonte
Interessante ... Consegui chamá-lo assim no meu projeto sem nenhum problema ... Talvez eu tenha uma estrutura de layout de exibição mais simples do que você tinha no entanto. Sua sugestão está correta, farei essa alteração na minha resposta.
Stunner
Por acaso, deparei com o problema quando eu girei meu aplicativo. Se você tivesse a rotação desativada, provavelmente não teria um problema.
22413 Jeremy
Não tenho rotação ativada no meu projeto e me deparei com o problema, mas sim, ainda é um bom ponto.
Stunner
1
Para qualquer pessoa que implemente seu próprio controlador de contêiner, esta é a maneira correta de ajustar o status ou a barra de navegação subjacente!
Rafael Nobre
Se você alterar a origem, mas não a altura dos limites da vista, a parte inferior não será cortada pela borda inferior da tela pela quantidade que você alterou a origem? (por isso se torna impossível ver os últimos linhas de pixels)
Tenfour04
20

Adicionando à resposta superior:

depois que o segundo método não pareceu funcionar, eu fiz alguns ajustes adicionais e encontrei a solução.

TLDR; a segunda solução da resposta principal quase funciona, mas para algumas versões do xCode, pressione a tecla Ctrl e arraste para "Guia de layout superior" e selecione Espaçamento vertical. No entanto, ajustando primeiro o tamanho da Visualização da tabela e selecionando "Guia de layout de espaço superior a superior" funciona


  1. Arraste um ViewController em branco para o storyboard. Ver Controlador

  2. Arraste um objeto UITableView para a Exibir. (Não UITableViewController). Posicione-o no centro, usando as guias de layout azuis.

Vista de mesa Center Image

  1. Arraste um UITableViewCell para o TableView. Esta será a sua célula de reutilização do protótipo. Portanto, não se esqueça de configurá-lo como Identificador de Reutilização na guia Atributos ou você poderá sofrer uma falha.

Adicionar célula de exibição de tabela Identificador de reutilização

  1. Crie sua subclasse personalizada de UIViewController e adicione o <UITableViewDataSource, UITableViewDelegate> protocolos. Não se esqueça de definir o ViewController do seu storyboard para essa classe no Identity Inspector.

  2. Crie uma saída para o seu TableView no seu arquivo de implementação e chame-o de "tableView"

Criar saída vista de mesa

  1. Clique com o botão direito do mouse no TableView e arraste o dataSource e o delegado para o seu ViewController.

delegado dataSource

Agora, a parte de não recorte na barra de status.

  1. Pegue a borda superior da sua Table View e mova-a para baixo para uma das guias azuis tracejadas de layout automático próximas à parte superior

redimensionar

  1. Agora, você pode controlar o arrasto da Visualização da tabela para o topo e selecionar Espaço superior ao guia de layout superior

Guia de Layout de Topo a Topo

  1. Isso fornecerá um erro sobre o layout ambíguo do TableView, basta adicionar restrições ausentes e pronto.

Adicionar restrições ausentes

Agora você pode configurar sua exibição de tabela normalmente, e ela não cortará a barra de status!

ErikAGriffin
fonte
11
- (void) viewDidLayoutSubviews {
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
        if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
            self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
        self.navigationController.navigationBar.translucent = NO;
    }
}

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW1

Olzh
fonte
2
alterne <= para> e remova o bloco if vazio
pfrank 28/10
1
A leitura self.topLayoutGuide.lengthde viewDidLayoutSubviewsirá estragar o layout das visualizações filho.
@OLzh, conforme descrito, self.tableView não pode rolar.
DawnSong
8

Selecione UIViewController no seu storyboard e desmarque a opção Estender arestas sob as barras superiores. Trabalhou para mim. :)

pegpeg
fonte
Infelizmente, não funcionou para mim. O UITableViewController completamente padrão ainda se sobrepõe à barra de status. Acho que a barra de status não conta como barra superior. Apenas barras de navegação e barras de tabulação.
Andrew Duncan
A única solução que funciona para mim, ty. (Observe que você deve "diminuir" a exibição da tabela na barra de status no IB e atualizar as restrições).
Martin Makarsky
Trabalhou para mim no Xcode 8 com um UITableViewController.
Edouard Barbier
8

É assim que se escreve em "Swift". Um ajuste na resposta de @ lipka:

tableView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)
uplearnedu.com
fonte
O rápido não é permitido aqui?
Uplearnedu.com
Única solução que funcionou para mim, que não me faz criar um UIViewController
Shereef Marzouk
1
Isso é menos do que o ideal, pois mantém a margem interna superior a 20, mesmo na paisagem onde não há barra de status padrão no iOS8
voidref
Essa variação lida com qualquer configuração para mim:- (void)viewDidLayoutSubviews { if (self.tableView.contentInset.top != self.topLayoutGuide.length) { self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0); } }
qix 20/07/16
5

Para o Xcode 7, desmarcar a marca de seleção 'translúcida' da barra de navegação funcionou para mim.

insira a descrição da imagem aqui

David T
fonte
Mais simples, mais rápido, mais fácil, mais seguro? solução. Não sei por que isso tem tão poucos votos positivos em comparação com todo o resto.
Gruntcakes
3

Isso o corrigirá para um UITableViewController (sem nenhum número mágico). A única coisa que não consegui consertar é se você estiver em uma ligação, e nesse caso a parte superior do tableView é pressionada demais. Se alguém souber como resolver isso, informe-nos.

class MyTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()    
        configureTableViewTop()
    }

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
        coordinator.animateAlongsideTransition({ (context) -> Void in
            }, completion: { (context) -> Void in
                self.configureTableViewTop()
        })
    }

    func configureTableViewTop() { 
        tableView.contentInset.top = UIApplication.sharedApplication().statusBarFrame.height
    }
}
Harris
fonte
2

Não sei o quão Kosher é, mas descobri que esse esquema move a visão do ViewController para baixo e fornece à barra de status um histórico sólido:

- (void)viewDidLoad {
    [super viewDidLoad];

    // Shove everything down if iOS 7 or later
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0f) {

        // Move the view down 20 pixels
        CGRect bounds = self.view.bounds;
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];

        // Create a solid color background for the status bar
        CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
        UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
        statusBar.backgroundColor = [UIColor redColor];
        [self.view addSubview:statusBar];
    }

Claro, substitua redColor pela cor que desejar para o fundo.

Você deve executar um dos swizzles separadamente para definir a cor dos caracteres / símbolos na barra de status. Eu uso View controller-based status bar appearance = NOe, Status bar style = Opaque black styleno essencial, para fazer isso globalmente.

Parece funcionar, e eu ficaria interessado em ouvir algum bug ou problema com ele.

Hot Licks
fonte
2

A resposta do chappjc funciona muito bem quando se trabalha com XIBs.

Encontrei a solução mais limpa ao criar o TableViewControllers programaticamente, envolvendo a instância UITableViewController em outro UIViewController e definindo as restrições de acordo.

Aqui está:

UIViewController *containerLeftViewController = [[UIViewController alloc] init];
UITableViewController *tableViewController = [[UITableViewController alloc] init];

containerLeftViewController.view.backgroundColor = [UIColor redColor];

hostsAndMoreTableViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
[containerLeftViewController.view addSubview:tableViewController.view];

[containerLeftViewController addChildViewController:tableViewController];
[tableViewController didMoveToParentViewController:containerLeftViewController];

NSDictionary * viewsDict = @{ @"tableView": tableViewController.view ,
                              @"topGuide": containerLeftViewController.topLayoutGuide,
                              @"bottomGuide": containerLeftViewController.bottomLayoutGuide,
                              };
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tableView]|"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide][tableView][bottomGuide]"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];

Cheers, Ben

bhr
fonte
1

Acho que a abordagem para usar o UITableViewController pode ser um pouco diferente do que você fez antes. Funcionou para mim, mas você pode não ser um fã disso. O que fiz foi ter um controlador de exibição com uma exibição de contêiner que aponta para meu UItableViewController. Dessa forma, posso usar o TopLayoutGuide fornecido ao meu storyboard. Basta adicionar a restrição à visualização do contêiner e você deve cuidar do iOS7 e iOS6.

Phong Le
fonte
1

Acabei usando uma visualização extra com o fundo desejado, adicionado após o TableView e colocado na barra de status:

    self.CoverView = [[UIView alloc]init];

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

    self.CoverView.frame = CGRectMake(0,0,self.view.bounds.size.width,20);
    }

    self.CoverView.backgroundColor = [UIColor whiteColor];
    self.TableView = [[UITableView alloc]initWithFrame:CGRectMake(0,
    self.CoverView.bounds.size.height,XXX, YYY)];
    [self.view addSubview:self.TableView];
    [self.view addSubview:self.CoverView];

Não é muito bonito, mas é uma solução bastante simples, se você precisar trabalhar com visualizações sem xib e com o IOS6 e o ​​IOS7

lilislilit
fonte
1

Fiz isso para a exibição Retina / Não Retina como

BOOL isRetina = FALSE;

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    if ([[UIScreen mainScreen] scale] == 2.0) {
        isRetina = TRUE;
    } else {
        isRetina = FALSE;
    }
}

if (isRetina) {
    self.edgesForExtendedLayout=UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars=NO;
    self.automaticallyAdjustsScrollViewInsets=NO;
}
MaxEcho
fonte
1

A solução a seguir funciona bem em código sem usar constantes mágicas e explica o usuário alterando a classe de tamanho, por exemplo, através de rotações ou aplicativos lado a lado em ipads:

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    // Fix up content offset to ensure the tableview isn't underlapping the status bar.
    self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0);
}
qix
fonte
1

Funciona com rapidez 3 - In viewDidLoad ();

let statusBarHeight = UIApplication.shared.statusBarFrame.height

let insets = UIEdgeInsets(top: statusBarHeight, left: 0, bottom: 0, right: 0)
tableView.contentInset = insets
tableView.scrollIndicatorInsets = insets

Este código: 1. Obtém a altura da barra de status 2. Fornece à parte superior da tabela uma inserção de conteúdo igual à altura da barra de status. 3. Fornece o mesmo indicador de rolagem, para que ele apareça abaixo da barra de status.

Wesh RaphLola
fonte
1

Para aqueles como eu, que preferem não incorporá-los UITableViewControllerem umUIViewController tente o seguinte:

Uma UITableViewControllersubclasse personalizada pode anexar uma visualização de máscara à superview do tableView. Adicione a máscara em viewDidAppear e remova a máscara em viewWillDisappear.

private var statusBarMaskView: UIView!

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if let superview = self.tableView.superview {
        self.statusBarMaskView = UIView(frame: CGRect.zero)
        superview.insertSubview(self.statusBarMaskView, aboveSubview: self.tableView)
        self.statusBarMaskView.backgroundColor = self.tableView.backgroundColor

        // using a nice constraint layout library to set the frame
        self.statusBarMaskView.pinTop(to: superview)
        self.statusBarMaskView.pinLeft(to: superview)
        self.statusBarMaskView.pinRight(to: superview)
        self.statusBarMaskView.addHeightConstraint(with: 22.0)
        ////
    }
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    self.statusBarMaskView.removeFromSuperview()
    self.statusBarMaskView = nil
}
Lee Irvine
fonte
0

Eu tinha um UISearchBar na parte superior do meu UITableView e o seguinte funcionou;

self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);
self.tableView.contentOffset = CGPointMake(0, -20);

Compartilhe e curta...

Sam T
fonte
0

Eu consegui trabalhar definindo o tamanho para forma livre

insira a descrição da imagem aqui

fengd
fonte
2
As "Métricas simuladas" se aplicam apenas à visualização da sua criação no Xcode, não na realidade. [Veja: stackoverflow.com/questions/16279379/…
Tyler A.
0

A solução de Abrahamchez https://developer.apple.com/library/ios/qa/qa1797/_index.html funcionou para mim da seguinte maneira. Eu tinha um único controlador UITableview como minha visualização inicial. Eu tentei o código de deslocamento e a incorporação em um navcon, mas nenhum resolveu a transparência da barra de status.

Adicione um Viewcontroller e torne-o a visualização inicial. Isso deve mostrar os guias críticos de layout superior e inferior.

Arraste o Tableview antigo para a View no novo controlador.

Faça todo o necessário para adaptar a tabela ao novo controlador:

Altere seu arquivo controller.h da visualização antiga para herdar / subclasse de UIViewController em vez de UITableViewController.

Adicione UITableViewDataSource e UITableViewDelegate ao .h do controlador de exibição.

Reconecte qualquer coisa necessária no storyboard, como uma barra de pesquisa.

O importante é configurar as restrições, como nas perguntas e respostas da Apple. Não me incomodei em inserir uma barra de ferramentas. Não tenho certeza da sequência exata. Mas um ícone vermelho apareceu nos Guias de layout, talvez quando eu construí. Cliquei e deixei o Xcode instalar / limpar as restrições.

Depois, cliquei em todos os lugares até encontrar a restrição de espaço vertical e alterar seu valor máximo de -20 para 0 e funcionou perfeitamente.

Jack Bellis
fonte
0

Estou usando um UISplitViewController com um controlador de navegação e um controlador de tableview. Isso funcionou para mim na visualização principal depois de tentar muitas soluções aqui:

float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {

    // Move the view down 20 pixels
    CGRect bounds = self.view.bounds;
    bounds.origin.y -= 20.0;
    [self.navigationController.view setBounds:bounds];

    // Create a solid color background for the status bar
    CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
    UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
    statusBar.backgroundColor = [UIColor whiteColor];
    [statusBar setAlpha:1.0f];
    [statusBar setOpaque:YES];
    [self.navigationController.view addSubview:statusBar];
}

É semelhante à solução do Hot Licks, mas aplica a subvisão ao navigationController.

sfr14
fonte
Esta é a única resposta que funcionou para mim no iOS 8!
SamB
0
override func viewDidLoad() {
 // your code

 if let nc = self.navigationController {
   yourView.frame.origin.y = nc.navigationBar.frame.origin.y + nc.navigationBar.frame.height
  }
}
wajih
fonte
0

Aqui está um Swift 2.3. (Xcode 8.0). Eu criei uma subclasse de UITableView.

class MYCustomTableView: UITableView
{   
    override func drawRect(rect: CGRect) {
        super.drawRect(rect)
        contentInset    = UIEdgeInsetsZero
    }
}

O conteúdo inserido sempre deve ser zero (por padrão). Estou definindo Zero manualmente. Você também pode adicionar um método de verificação que faça a verificação e, se for algo diferente do que você deseja, obtenha o retângulo correto. A alteração será refletida apenas quando a visualização da tabela for desenhada (o que não acontece frequentemente).

Não se esqueça de atualizar o TableView no seu IB (no TableViewController ou apenas no TableView dentro do seu ViewController).

Darkwonder
fonte
0

Eu estava enfrentando esse problema no iOS 11, mas o layout estava correto para o iOS 8 - 10.3.3. Para o meu caso, defino uma restrição de espaço vertical como Superview.Top Margin em vez de Superview.Top, que funciona para o iOS 8-11.

insira a descrição da imagem aqui

Temerário
fonte
0

Eu achei a maneira mais fácil de fazer isso, especialmente se você estiver adicionando sua visualização de tabela dentro da barra de guias, primeiro adicione uma visualização e, em seguida, adicione a visualização de tabela dentro dessa visualização . Isso fornece os guias de margem superior que você está procurando.

insira a descrição da imagem aqui

NSCoder
fonte
-1

veja todas as soluções: meu projeto é apenas usar xib; portanto, a solução com storyboard não funcionou para mim. self.edgesForExtendedLayout = UIRectEdgeNone; só funciona para o controlador se a barra de navegação estiver visível. mas se sua visualização tiver apenas barra de status, isso não funcionará. então eu combino duas condições.

- (void) viewDidLayoutSubviews {
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {
    CGRect bounds = self.view.bounds;
    if(self.navigationController == nil || self.navigationController.isNavigationBarHidden == YES){
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];
    }
    else{
        self.edgesForExtendedLayout = UIRectEdgeNone;
    }
}

ajude isso a funcionar.

phnix
fonte
-2

Se você também precisar oferecer suporte ao iOS 6, precisará movê-lo condicionalmente para baixo. Ou seja, no iOS 7, você deve movê-lo para baixo em 20 pontos (por framemanipulação ou usando o layout automático) e no iOS 6, você o deixa em paz. Eu não acredito que você possa fazer isso no IB, então você terá que fazer isso no código.

EDITAR

Você pode realmente fazer isso no IB, usando os deltas do iOS6 / iOS7. Defina sua posição no iOS 7 e, no iOS 6, defina o delta Y para -20 pontos. Veja esta pergunta para mais informações.

Scott Berrevoets
fonte
Abaixar o quadro não o altera infelizmente.
Nicholas Smith
O que não funciona sobre isso? A exibição da tabela não se move para baixo?
Scott Berrevoets
Sim, permanece na mesma posição. Eu tentei self.view.framee self.tableView.frame, em ambos viewWillAppeare viewDidLoad. Para estar seguro, também defini setContentNeedsDisplaypara forçar um redesenho.
Nicholas Smith
O layout automático está ativado?
Scott Berrevoets
Sim, é autolayout e Storyboard.
Nicholas Smith