Colegas de desenvolvimento, estou tendo problemas com o AutoLayout no Interface Builder (Xcode 5 / iOS 7). É muito básico e importante, então acho que todos devem saber como isso funciona corretamente. Se este é um bug no Xcode, é um problema crítico!
Portanto, sempre que tenho uma hierarquia de exibição como essa, tenho problemas:
>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (or any other comparable UIKit Element)
O UIScrollView possui restrições sólidas, por exemplo, 50 px de todos os lados (sem problemas). Em seguida, adiciono uma restrição de espaço superior ao UILabel (sem problemas) (e posso até fixar a altura / largura do rótulo, não altera nada, mas deve ser desnecessário devido ao tamanho intrínseco do rótulo)
O problema começa quando adiciono uma restrição à direita no UILabel:
Por exemplo, espaço à direita para: Superview Igual a: 25
Agora, dois avisos ocorrem - e eu não entendo o porquê:
A) Ambigüidade de tamanho de conteúdo rolável (a exibição de rolagem possui altura / largura ambígua de conteúdo rolável)
B) Visualizações incorretas (rótulo esperado: x = -67 Real: x = 207
Fiz este exemplo mínimo em um projeto recém-baixado, que você pode baixar e anexei uma captura de tela. Como você pode ver, o Interface Builder espera que o Label fique fora do limite do UIScrollView (o retângulo tracejado laranja). A atualização do quadro da etiqueta com a ferramenta Resolver problemas move-a para a direita.
Observação: se você substituir o UIScrollView por um UIView, o comportamento será o esperado (o quadro do Label está correto e de acordo com a restrição). Portanto, parece haver um problema com o UIScrollView ou estou perdendo algo importante.
Quando executo o aplicativo sem atualizar o quadro do Label, conforme sugerido pelo IB, ele está posicionado perfeitamente, exatamente onde deveria estar e o UIScrollView é rolável. Se eu atualizar o quadro, a etiqueta estará fora de vista e o UIScrollView não rolará.
Ajude-me Obi-Wan Kenobi! Por que o layout ambíguo? Por que a visão equivocada?
Você pode baixar o projeto de amostra aqui e tentar descobrir o que está acontecendo: https://github.com/Wirsing84/AutoLayoutProblem
fonte
UIScrollView
diretamente. Em vez disso, useUICollectionView
ouUITableView
o máximo possível, principalmente tudo é possível com esse elemento e também fornece simplicidade, legibilidade e reutilização !!!Respostas:
Então, eu apenas resolvi desta maneira:
Dentro do
UIScrollView
add aUIView
(podemos chamar assimcontentView
);Nesse caso
contentView
, defina as margens superior, inferior, esquerda e direita como 0 (é claroscrollView
que é essa asuperView
); O conjunto também alinha o centro horizontal e verticalmente ;Terminado .
Agora você pode adicionar todos os seus pontos de vista em que
contentView
, econtentSize
doscrollView
serão automaticamente redimensionadas de acordo com ocontentView
.Atualizar:
Algum caso especial é coberto por este vídeo postado por @Sergio nos comentários abaixo.
fonte
Esse erro levou um tempo para ser rastreado. Inicialmente, tentei fixar o tamanho do ScrollView, mas a mensagem de erro diz claramente "tamanho do conteúdo". Certifiquei-me de que tudo que fixei da parte superior do ScrollView também fosse fixado na parte inferior. Dessa forma, o ScrollView pode calcular a altura do conteúdo localizando a altura de todos os objetos e restrições. Isso resolveu a altura do conteúdo ambíguo, a largura é bem semelhante ... Inicialmente, eu tinha quase tudo que X estava centrado no ScrollView, mas também tinha que fixar os objetos na lateral do ScrollView. Não gosto disso porque o iPhone6 pode ter uma tela maior, mas removerá o erro 'largura do conteúdo ambíguo'.
fonte
Xcode 11+
A maneira mais simples de usar
autolayout
:UIScrollView
e fixe0,0,0,0
na superview (ou no tamanho desejado)UIView
ScrollView, fixe-o0,0,0,0
nos quatro lados e centralize-ohorizontally
evertically
.bottom
ealign center Y
priorize para 250. (para alteração de rolagem horizontaltrailing
ealign center X
)UIScrollView
, selecione o inspetor de tamanho e desmarqueContent Layout Guides
.fonte
É a resposta para minha pergunta auto-respondida UIScrollView + Visão centralizada + Tamanho do conteúdo rolável ambíguo + muitos tamanhos de iPhone .
Mas também cobre totalmente o seu caso!
Então, aqui está o estado inicial para o caso mais simples:
Has ambiguous scrollable content width
eHas ambiguous scrollable content height
.Tudo o que precisamos fazer é:
Importante: você deve adicionar restrições à direita e / ou inferiores . Não é "líder e top" - não é obras!
Você pode verificá-lo no meu projeto de exemplo , demonstrando como corrigir esse problema.
PS
Segundo a lógica - essa ação deve causar "restrições conflitantes". Mas não!
Não sei por que ele funciona e como o Xcode detecta qual restrição é mais priorizada (porque não tenho prioridade para explicitamente essas restrições). Ficarei agradecido se alguém explicar, por que isso funciona nos comentários abaixo.
fonte
Xcode 11+, Swift 5
Se você está se perguntando por que todas as respostas não funcionam mais, verifique se fixou a visualização de conteúdo (aquela que você inseriu na visualização de rolagem) no Guia de Layout de Conteúdo da visualização de rolagem e NÃO no Guia de Layout de Quadro.
As bordas da exibição de conteúdo (à esquerda, à direita, à esquerda, na parte superior e na parte inferior) não devem ser fixadas como à esquerda na imagem - para o Guia de layout de quadros
mas assim - no Guia de layout de conteúdo.
E então a maioria das respostas funcionará para você.
A abordagem mais simples agora é a seguinte:
No geral, sua estrutura na implementação mais simples será parecida com esta
fonte
Você precisa criar uma
UIView
subvisão doUIScrollView
descrito abaixo:UIViewController
UIView
'Vista principal'UIScrollView
UIView
'Visualização de contêiner'O segundo passo é fazer as
UIScrollView
restrições. Fiz isso com as restrições superior, inferior, inicial e final do seu superView.Em seguida, adicionei as restrições para o contêiner de
UIScrollView
e aqui é onde o problema começa. Quando você coloca as mesmas restrições (superior, inferior, inicial e final), o Storyboard envia uma mensagem de aviso:"Possui largura de conteúdo rolável ambígua" e "Possui altura de conteúdo rolável ambígua"
Continue com as mesmas restrições acima e adicione as restrições
Equal Height
eEqual Width
à sua Exibição de contêiner em relação à Vista principal e não à suaUIScrollView
. Em outras palavras, as restrições da exibição do contêiner estão vinculadas àUIScrollView
super visão geral.Depois disso, você não receberá avisos no seu Storyboard e poderá continuar adicionando as restrições para suas subvisões.
fonte
Eu tive o mesmo problema. Desmarque esta caixa de seleção. Desde que você está definindo o tamanho do conteúdo no código.
fonte
Finalmente descobri isso, espero que seja mais fácil de entender.
Muitas vezes, você pode ignorar esse aviso adicionando um UIView base à visualização de rolagem como uma "exibição de conteúdo", como eles mencionaram e o tornam do mesmo tamanho que sua visualização de rolagem e, nessa exibição de conteúdo, defina esses 6 parâmetros.
Como você pode ver, você precisa de 6 parâmetros totais! O que .. em circunstâncias normais, você está duplicando duas restrições, mas esta é a maneira de evitar esse erro no storyboard.
fonte
Sei que estou atrasado, mas a próxima solução resolve esse tipo de problema sem código adicional , apenas usando storyboards:
Para sua visualização de conteúdo, você precisa definir restrições para os espaços à esquerda / à direita / superior / inferior para visualizar a rolagem e isso não altera o quadro da visualização de conteúdo , assim:
Obviamente, você precisa criar restrições adicionais para a exibição do conteúdo, para que a exibição por rolagem possa saber o tamanho do conteúdo. Por exemplo, defina a altura fixa e o centro x.
Espero que isto ajude.
fonte
Para mim, adicionar um
contentView
realmente não funcionou como sugerido. Além disso, ele cria uma sobrecarga devido à visão adicional (embora eu não considere isso um grande problema). O que funcionou melhor para mim foi apenas desativar a verificação de ambiguidade para o meuscrollView
. Tudo está bem, então acho que está tudo bem em casos simples como o meu. Mas lembre-se de que, se houver outras restrições à suascrollView
interrupção, o Interface-Builder não avisará mais sobre isso.fonte
Confira este tutorial muito rápido e direto sobre como obter a visualização de rolagem funcionando e totalmente rolável com layout automático. Agora, a única coisa que ainda me deixa perplexa é por que o tamanho do conteúdo da visualização de rolagem é sempre maior que o necessário.
http://samwize.com/2014/03/14/how-to-use-uiscrollview-with-autolayout/
fonte
Veja abaixo: visualização de conteúdo em scrollview vertical e horizontal centralizada. você recebeu um erro de ambiguidade, sempre verifique se os dois adicionados à visualização de rolagem a partir da visualização de conteúdo são 1) .botão de espaço no contêiner.
esses meios de restrição na rolagem são quanto você pode rolar após a altura ou largura da exibição do conteúdo.
isso pode ajudá-lo.
fonte
Resolvi esse tipo de problema para minha visualização usando "Resolver problemas de layout automático"> "Adicionar restrições ausentes" na Visualização Selecionada
As duas restrições a seguir resolvem meu problema:
em que: final, inferior, é o final, inferior do UIScrollView
fonte
Usando contentView (
UView
) como no interior do recipienteUIScrollView
, a vara bordas (top
,bottom
,trailing
,leading
) de superview (UIScrollView
) econtentView
deve terequalwidth
eequalheight
a superview. Essas são restrições. E chamada de método:Problemas resolvidos para mim.
fonte
Abordagem Swift 4+:
1) Defina as margens superior, inferior, esquerda e direita do UIScrollView como 0
2) Dentro do UIScrollView, adicione um UIView e defina as margens superior, inferior, à esquerda e à direita como 0 (igual às margens do UIScrollView).
3) A parte mais importante é definir a largura e a altura, onde a restrição de altura deve ter baixa prioridade .
fonte
A resposta de @Matteo Gobbi é perfeita, mas no meu caso, a scrollview não pode rolar, removo " align center Y " e adiciono " height> = 1 ", a scrollview se torna rolável
fonte
As pessoas que estão enfrentando dificuldades com o uiscrollview e não rolam apenas definem a restrição inferior da visualização de conteúdo com o layout inferior da última visualização (que fica dentro da visualização de conteúdo). Não se esqueça de remover a restrição central Y.
Descanse todas as restrições são as mesmas definidas acima. A visualização de rolagem preocupa-se apenas em obter a altura máxima da visualização de conteúdo, e a definimos como a restrição inferior da última visualização, o que significa que a visualização de rolagem alterará automaticamente o deslocamento do conteúdo.
No meu caso, a última visualização foi UILable com nenhuma propriedade de linhas = 0 (que ajusta automaticamente sua altura dependendo do conteúdo) para aumentar dinamicamente a altura do uilable e, eventualmente, nossa área de rolagem aumenta devido ao layout inferior do uilable estar alinhado com o fundo da visualização de conteúdo, o que força a visualização de rolagem para aumentar o deslocamento do conteúdo.
fonte
Criei um vídeo no youTube
Scroll StackViews usando apenas Storyboard no Xcode
Eu acho que dois tipos de cenários podem aparecer aqui.
A vista dentro do scrollView -
UIView
)UIStackView
)Para uma exibição rolável verticalmente nos dois casos, você precisa adicionar estas restrições:
4 restrições da parte superior, esquerda, inferior e direita.
Largura igual à visualização de rolagem (para interromper a rolagem horizontal)
Você não precisa de outras restrições para visualizações que tenham sua própria altura de conteúdo intrínseco.
Para visualizações que não possuem altura intrínseca de conteúdo, é necessário adicionar uma restrição de altura. A exibição rolará apenas se a restrição de altura for maior que a altura do scrollView.
fonte
Resultado:
fonte
No meu caso, recebi a questão do tamanho do conteúdo incorreto e da ambiguidade do tamanho do conteúdo no iPad, mas estava funcionando no caso do iPhone. Fiz as seguintes alterações no storyboard para resolver o problema.
fonte
Rolagem Vertical
fonte
O que fiz foi criar uma exibição de conteúdo separada, como mostrado aqui.
A visualização de conteúdo é de forma livre e pode ter todas as subvisões adicionadas a ela com suas próprias restrições em relação ao contentView.
O UIScrollView é adicionado ao controlador de exibição principal.
Programaticamente, adiciono o contentView que está vinculado via IBOutlet à classe e defino o contentView do UIScrollView.
fonte
Eu estava recebendo o mesmo erro .. eu fiz o seguinte
Agora adicione à esquerda / à direita / superior / inferior para scrollView (2) e UIView (3).
Selecione View (1) e View (3) com a mesma altura e peso. Resolvi meu problema.
Eu fiz o vídeo que ajudará:
https://www.youtube.com/watch?v=s-CPN3xZS1A
fonte
[testado no XCode 7.2 e no iOS 9.2]
O que suprimiu os erros e avisos do Storyboard para mim foi definir o tamanho intrínseco da exibição de rolagem e da exibição de conteúdo (no meu caso, uma exibição de pilha) como Placeholder . Essa configuração é encontrada no inspetor Tamanho no Storyboard. E diz - Definir um tamanho de conteúdo intrínseco para o tempo de design afeta apenas uma exibição durante a edição no Interface Builder. A visualização não terá esse tamanho de conteúdo intrínseco em tempo de execução.
Então, acho que não estamos errando ao definir isso.
Nota: No storyboard, fixei todas as bordas do scrollview na superview e todas as bordas do stackview no scrollview. No meu código, que eu pus os translatesAutoresizingMaskIntoConstraints como falsa, tanto para o scrollview eo stackview. E eu não mencionei um tamanho de conteúdo. Quando o stackview cresce dinamicamente, as restrições definidas no storyboard garantem que a pilha seja rolável.
O aviso do storyboard estava me deixando louco e eu não queria centralizar as coisas horizontal ou verticalmente apenas para suprimir o aviso.
fonte
Se alguém está tendo um comportamento em que você percebe a barra de rolagem à direita, mas o conteúdo não se move, esse fato provavelmente vale a pena considerar:
Isso é da documentação da Apple . Por exemplo, se você fixou acidentalmente seu Label / Button / Img / View superior na exibição fora da área de rolagem (talvez um cabeçalho ou algo logo acima do scrollView?) Em vez do contentView, você congelaria todo o contentView no local.
fonte
Conforme mencionado nas respostas anteriores, você deve adicionar uma visualização personalizada dentro da visualização de rolagem:
Adicione todas as suas subvisões à visualização de conteúdo. Em algum momento, você verá uma exibição de conteúdo de rolagem com aviso de tamanho de conteúdo ambíguo, selecione a exibição de conteúdo e clique no botão "Resolver problemas de layout automático" (no canto inferior direito do layout do IB) e selecione a opção "Adicionar ausente restrições ".
A partir de agora, quando você executar o projeto, a visualização de rolagem atualizará automaticamente seu tamanho de conteúdo, sem necessidade de código adicional.
fonte
No meu caso - uma exibição de rolagem de rolagem horizontal - eu também precisava adicionar restrições de largura e altura para cada filho da exibição de rolagem, embora a nota técnica da Apple não informe isso.
fonte
Defina o tamanho do ViewController (aquele que contém o UIScrollView) como Forma livre no inspetor de tamanho do Interface Builder e tudo deve funcionar.
Configuração de forma livre no Inspetor de tamanho no Interface Builder para o controlador UIView
fonte
Se você ainda tiver problemas com o UIScrollView, basta desativar os Guias de layout de conteúdo (selecione seu ScrollView no xcode Interface Builder -> escolha Inspetor de tamanho no painel direito -> desmarque 'Guias de layout de conteúdo') Ou tente estas etapas: xcode 11 layouts de exibição de rolagem - pode ser útil para o novo estilo de layout. Funciona bem no macOS 10.15.2, Xcode 11.3.1, para 05.02.2020
veja a captura de tela
fonte
Usando o Autolayout
Adicione sua visualização de rolagem dentro de uma visualização bem definida e, em seguida, adicione a visualização de pilha dentro da visualização de rolagem
Adicione restrições superior, esquerda, direita, inferior, central X e Y central da exibição de rolagem e da pilha às super-visões relevantes
Verifique se as restrições estão vinculadas da visualização em pilha à superview correta (visualização em rolagem), pois a configuração padrão atual é adicionar uma restrição Alinhar à parte superior e não uma restrição ao espaço superior.
fonte