Eu tenho lido muito sobre a transição da interface do iOS7.
Eu não sou capaz de conseguir o que essas três propriedades automaticallyAdjustsScrollViewInsets
, extendedLayoutIncludesOpaqueBars
, edgesForExtendedLayout
??
Por exemplo, estou tentando fazer com que meus controladores de exibição iniciem abaixo da barra de status, mas não consigo alcançá-lo.
ios
objective-c
xcode
uiviewcontroller
ios7
user1010819
fonte
fonte
Respostas:
A partir do iOS7, os controladores de exibição usam o layout de tela cheia por padrão. Ao mesmo tempo, você tem mais controle sobre como ele expõe suas visualizações, e isso é feito com essas propriedades:
edgeForExtendedLayout
Basicamente, com essa propriedade, você define quais lados da visualização podem ser estendidos para cobrir a tela inteira. Imagine que você insere um
UIViewController
em umUINavigationController
. Quando a exibição desse controlador de exibição é organizada, ela começa onde a barra de navegação termina, mas essa propriedade define quais lados da exibição (superior, esquerda, inferior, direita) podem ser estendidos para preencher a tela inteira.Vamos vê-lo com um exemplo:
Aqui você não está definindo o valor de
edgesForExtendedLayout
, portanto, o valor padrão é obtido (UIRectEdgeAll
), portanto a exibição estende seu layout para preencher a tela inteira.Este é o resultado:
Como você pode ver, o fundo vermelho se estende atrás da barra de navegação e da barra de status.
Agora, você definirá esse valor como
UIRectEdgeNone
, dizendo ao controlador de exibição para não estender a exibição para cobrir a tela:E o resultado:
automaticAdjustsScrollViewInsets
Essa propriedade é usada quando sua visualização é
UIScrollView
ou semelhante, como aUITableView
. Você deseja que sua tabela comece onde a barra de navegação termina, porque você não verá todo o conteúdo, se não, mas ao mesmo tempo deseja que sua tabela cubra a tela inteira ao rolar. Nesse caso, definiredgesForExtendedLayout
como Nenhum não funcionará porque sua tabela começará a rolar onde a barra de navegação termina e ela não ficará atrás dela.Aqui é onde essa propriedade é útil, se você permitir que o controlador de visualização ajuste automaticamente as inserções (configurando essa propriedade como YES, também o valor padrão), ele adicionará inserções na parte superior da tabela, para que a tabela comece onde a navegação a barra termina, mas a rolagem cobre a tela inteira.
É quando está definido como NÃO:
E SIM (por padrão):
Nos dois casos, a tabela rola atrás da barra de navegação, mas no segundo caso (YES), ela começará abaixo da barra de navegação.
extendedLayoutIncludesOpaqueBars
Este valor é apenas uma adição aos anteriores. Por padrão, este parâmetro está definido como NÃO. Se a barra de status for opaca, as visualizações não serão estendidas para incluir a barra de status, mesmo se você estender sua visualização para cobri-la (
edgesForExtendedLayout
paraUIRectEdgeAll
).Se você definir o valor como YES, isso permitirá que a exibição volte novamente para a barra de status.
Se algo não estiver claro, escreva um comentário e eu responderei.
Como o iOS sabe qual UIScrollView usar?
O iOS obtém a primeira subvisão na visualização do seu ViewController, aquela no índice 0 e, se for uma subclasse
UIScrollView
, aplica as propriedades explicadas a ela.Obviamente, isso significa que
UITableViewController
funciona por padrão (já queUITableView
é a primeira visualização).fonte
Não tenho certeza se você está usando storyboards, mas se estiver, para fazer com que seus controladores de exibição sejam iniciados abaixo da barra de status (e acima da barra inferior):
Selecione o controlador de exibição em IB. No inspetor de atributos, desmarque 'Estender arestas - sob as barras superiores' e 'Estender arestas - sob barras inferiores'.
fonte
Estou usando storyboards e, usando os conselhos acima, funcionou, mas não sabia exatamente como implementá-lo. Abaixo está um breve exemplo de como ele resolveu o problema, colocando a solução recomendada no ViewController.
Meu problema: Ajuste automático definido como verdadeiro por padrão, causando uma diferença entre o design do storyboard e o simulador
Resolvido: código acima aplicado, desativando o ajuste automático.
fonte
Resolvi esse problema adicionando esta linha, mas meu problema estava relacionado a um
UIView
, nãoUIScrollView
fonte
Apenas lembre-se de que a
automaticallyAdjustsScrollViewInsets
propriedade funciona apenas se algum tipo de exibição de rolagem (exibição de tabela, exibição de coleção, ...) forOutro sugeriu que ele funcione mesmo que seja a primeira subvisão, mas há outras visualizações de rolagem na hierarquia de visualizações.
EDIT (extensão DIY)
Se você deseja um comportamento semelhante, mesmo que não possa atender a essas condições (por exemplo, uma imagem de plano de fundo abaixo da visualização de rolagem), você pode ajustar as inserções da visualização de rolagem manualmente. Mas por favor, não defina como constante como 44 ou 64 ou mesmo 20, como muitos sugerem em torno do SO. Você nunca sabe o tamanho. Pode haver a notificação de chamada / gps / áudio, a barra de navegação nem sempre precisa ter 44 pts, etc.
Acho que a melhor solução é usar o layoutGuide
length
em didLayoutSubviews:Você pode usar o bottomLayoutGuide da mesma maneira.
fonte