IOS7: deslocamento do UIScrollView no UINavigationController

126

No momento, estou migrando meu aplicativo no ios 7 e estou parado há horas no novo controlador de barra de navegação / gerenciamento.

Antes, quando tínhamos um controlador de navegação, tínhamos um trecho como este:

UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:[[MainViewController alloc]init]];

No criador de interface, tivemos a opção de definir uma barra de navegação existente para a visualização e tudo corresponder ao conteúdo da visualização real.

OK, então agora, eu não tenho idéia de como projetar corretamente com o construtor de interface. Ainda tenho meu snippet para inicializar meu navegador. No entanto, no construtor de interface do meu MainViewController, se eu definir uma barra de status como barra de navegação translúcida ou opaca, tenho um deslocamento de 44px na parte superior (veja abaixo).


Interface Builder_________________________E o resultado


Agora, se eu definir a barra de status como nenhuma, não haverá deslocamento na parte superior, mas como a exibição no simulador é menor por causa da barra de navegação, a parte inferior da exibição no criador de interfaces é cortada.

Interface Builder_________________________E o resultado

Acho que realmente estou perdendo alguma coisa aqui, mas não consigo encontrar nenhum tópico ou informação da maçã no iOS7 Transitions Guide sobre isso.

Obrigado pela ajuda


EDITAR

Como podemos ver nas fotos, o primeiro filho da visualização é um UIScrollView que contém os dois rótulos, o problema não aparece quando não há visualização de rolagem. Também aparece se for um UITableView. Se um rótulo estiver fora do UIScrollView, não haverá deslocamento para esse rótulo.

streem
fonte
Você pode querer usar AutoLayout se você não for, então você pode ter certeza que certos pontos de vista estão a uma distância longe da parte superior / inferior / lado da tela
erdekhayser
Na verdade, não estou usando o Autolayout, mas usá-lo (marcando a caixa de seleção) não resolve o problema.
streem
Com o Autolayout, você deve definir restrições para que as visualizações permaneçam no lugar. O Xcode não sabe o que você deseja automaticamente.
erdekhayser
Vendo sua edição anterior, acabei de descobrir seu problema. Infelizmente, não é a solução mais óbvia. Em vez de tentar explicar tudo de novo, usei este vídeo no Youtube para aprender a configurar visualizações de rolagem. youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be Boa sorte. Levei algumas vezes para assistir para entender completamente o que ele está fazendo.
erdekhayser

Respostas:

286

OK, então eu encontrei a solução, eu configurei no meu controlador a propriedade:

self.automaticallyAdjustsScrollViewInsets = false

Eu realmente não entendo o verdadeiro benefício dessa propriedade (ou por que o valor padrão é verdadeiro)

A única documentação que encontrei estava lá:

Atualizar

No iOS 11 automaticallyAdjustsScrollViewInsetsestá obsoleto

Agora você deve usar:

self.tableView.contentInsetAdjustmentBehavior = .never

Também o incentivo a verificar esta pergunta e sua resposta para entender melhor essas propriedades

streem
fonte
12
Ótima descoberta. O UIScrollView no storyboard é realmente complicado. Desejo que a Apple o torne um pouco transparente nas futuras versões do Xcode.
precisa saber é o seguinte
4
Esse código impede que minha UIScrollViewrolagem seja executada. Mas sem isso não posso me livrar da compensação. Weired ...
scaryguy
9
Esse sinalizador também pode ser desativado no storyboard / ponta, o View Controller possui uma caixa de seleção "Adjust Scroll View Insets". Estou batendo a cabeça contra a parede há tanto tempo, tentando resolver meus problemas com visualizações de rolagem e layout automático, ainda mais complicado com o suporte ao iOS 6 e 7. Então, muito obrigado por finalmente fornecer uma solução!
Newtz 28/01
2
O documento do aplicativo informa que a configuração navigationbar.translucent = YES impediria que a barra de navegação empurre o conteúdo para baixo. É a maior mentira e me custou muitas horas de trabalho até este post. Além disso, você deve definir self.automaticallyAdjustsScrollViewInsets = NO; Muito obrigado por este post!!!!!!! Maçã e maçã?
user779764
Descobri que isso fazia com que os limites do meu UIScrollView mudassem para baixo pela altura da barra de navegação (-64 pontos). Substituí isso manualmente para 0, mas achei que o UISrollView ainda rolaria no eixo y e "encaixaria" em uma linha imaginária em -64. Sua solução resolveu isso.
Gdbj
92

A resposta de @ Justafinger também funcionou como um encanto para mim.

Só queria acrescentar que essa configuração também pode ser ajustada facilmente a partir do construtor de interface.

  1. Selecione seu controlador de exibição
  2. Clique na guia 'Inspetor de atributos'
  3. Desmarque a opção 'Ajustar inserções de exibição de rolagem'
  4. Aproveitar!

insira a descrição da imagem aqui

Myxtic
fonte
Passou as idades procurando essa opção nas propriedades do UIScrollView e não no View Controller! Obrigado!
Dominic Williams
11

Eu estava com esse mesmo problema, mas encontrei uma propriedade bastante estranha no ViewController no construtor de interfaces que parece estar causando isso para mim. Há um conjunto de caixas de seleção "Estender arestas". Eu removi a verificação "Under Top Bars" e tudo começou a ficar bem definido para mim.

Ben Nicholas
fonte
Yup, este trabalhou para mim melhor do que "Ajuste Scroll Ver Inserções"
Dmytro
2

Com o AutomaticAdjustsScrollViewInsets definido como YES (a configuração padrão), há uma incompatibilidade no posicionamento da visualização de rolagem entre o ios6 e o ​​ios7; portanto, para torná-los consistentes, é necessário desativar essa configuração. No entanto, o ios6 falhará se aparecer automaticamenteAdjustsScrollViewInsets, portanto, você precisará fazer uma alteração programática de automaticamenteAdjustsScrollViewInsets condicional no ios7 ou desativar a opção usando o storyboard / NIB

dawid
fonte
2

Eu tive um problema semelhante, depois de descartar um viewController, o contentOffset do meu tableView foi alterado para (0, -64).

minha solução foi um pouco estranha, tentei todas as outras respostas, mas não obtive sucesso, a única coisa que resolveu meu problema foi mudar a posição do tableView na árvore de controles do .xib

foi o primeiro controle na exibição pai assim:

antes

Mudei o tableView logo após o ImageView e funcionou:

depois de

parece que colocar a vista da mesa na primeira posição estava causando o problema, e mover a vista da mesa para outra posição resolveu o problema.

PD Não estou usando autoLayout nem storyboards

espero que isso possa ajudar alguém!

Chuy47
fonte
Notei esse comportamento estranho, acredito que a lógica por trás disso é que o scrollViewInsets é ajustado automaticamente quando um scrollview é o primeiro filho. Caso contrário, isso realmente não faz sentido, porque sua visualização de rolagem provavelmente não está em tela cheia.
streem
1

Eu também enfrento esse problema.

UIScrollView o tamanho do conteúdo é calculado pelo SO como outros tamanhos, origens fornecidas pelo sistema de restrição - é por isso que o SO tem dúvidas.

Como corrigir - Você deve definir explicitamente o tamanho do conteúdo de UIScrollView:

  1. Incorporar conteúdo rolável para UIView(eu o renomeio para ContentView)
  2. Adicione restrições:

ContentView.Weight = View.Weight e ContentView.Height = View.Height

insira a descrição da imagem aqui

maslovsa
fonte
0

Parece que uma solução alternativa é exibir o arquivo do storyboard como "iOS 6.1 e anterior" (selecione o arquivo do storyboard-> Inspetor de arquivos-> Documento do Interface Builder-> Exibir como. As sub-visualizações de posicionamento neste modo mostram o deslocamento.

swhitman
fonte
Bem, eu não estou usando storyboard. No entanto, não tenho certeza de que seja um problema do ios6 ao ios7, o exemplo acima foi totalmente criado com o iOS 7. Além disso, editei minha pergunta, ela só aparece (tanto quanto eu sei) com uiscrollview e uitableview.
streem
Hmm interessante ... Analisando isso, você pode adicionar variant = "6xAndEarlier" na parte superior do XIB no elemento document, pois essa é a diferença ao inverter o bit mencionado acima. E, para sua informação, esse problema também acontece para o uiwebview para mim.
swhitman
0

Obrigado a vocês pelas soluções! Eu lutei por horas tentando resolver o problema. Tudo estava bem quando não havia nenhuma Barra de Navegação envolvida, mas ele foi mal no momento em que incorporei o ViewController em um NavigationController.

Eu o resolvi desmarcando as opções Inserir exibição de rolagem e as Barras inferiores . Ambos estão localizados no Inspetor de atributos do ViewController. Graças um milhão!

Jackson Gan
fonte