Digamos que adicionei mais visualizações no UIStackView que podem ser exibidas, como posso fazer a UIStackView
rolagem?
ios
uiscrollview
uistackview
itsaboutcode
fonte
fonte
Respostas:
Caso alguém esteja procurando uma solução sem código , criei um exemplo para fazer isso completamente no storyboard, usando o Layout automático.
Você pode obtê-lo no github .
Basicamente, para recriar o exemplo (para rolagem vertical):
UIScrollView
defina suas restrições.UIStackView
aoUIScrollView
Leading
,Trailing
,Top
eBottom
deve ser igual para os deUIScrollView
Width
restrição igual entreUIStackView
eUIScrollView
.UIStackView
UIViews
aoUIStackView
Troque
Width
pelaHeight
etapa 4 e definaAxis
=Horizontal
na etapa 5, para obter um UIStackView horizontal.fonte
O Guia de layout automático da Apple inclui uma seção inteira sobre Trabalho com vistas de rolagem . Alguns trechos relevantes:
Além disso:
Para resumir, a exibição de conteúdo da exibição de rolagem (nesse caso, uma exibição de pilha) deve ser fixada nas bordas e ter sua largura e / ou altura restritas. Isso significa que o conteúdo da visualização de pilha deve ser restrito (direta ou indiretamente) nas direções em que a rolagem é desejada, o que pode significar adicionar uma restrição de altura a cada visualização dentro de uma visualização de pilha de rolagem vertical, por exemplo. A seguir, é apresentado um exemplo de como permitir a rolagem vertical de uma exibição de rolagem que contém uma exibição de pilha:
fonte
Need constraints for: Y position or height.
Esse erro desaparece se você definir uma restrição de largura e altura para a exibição da pilha, que desativa a rolagem vertical. Esse código ainda funciona para você?As restrições na resposta mais votada aqui funcionaram para mim e colei uma imagem das restrições abaixo, criada no meu storyboard.
Eu atingi dois problemas, porém, de que outros deveriam estar cientes:
Depois de adicionar restrições semelhantes às da resposta aceita, recebia o erro vermelho de execução automática
Need constraints for: X position or width
. Isso foi resolvido adicionando um UILabel como uma subvisualização da visualização da pilha.Estou adicionando as subvisões programaticamente, então, originalmente, não tinha subvisões no storyboard. Para se livrar dos erros de execução automática, adicione uma subvisão ao storyboard e remova-a quando estiver carregando antes de adicionar suas subvisões e restrições reais.
Inicialmente, tentei adicionar
UIButtons
ao UIStackView. Os botões e as visualizações seriam carregados, mas a visualização de rolagem não rolaria . Isso foi resolvido adicionandoUILabels
se à exibição de pilha em vez de botões. Usando as mesmas restrições, essa hierarquia de exibição com os UILabels rola, mas os UIButtons não.Eu estou confuso com este problema, como os UIButtons não parecem ter uma IntrinsicContentSize (usado pelo Ver Stack). Se alguém souber por que os botões não funcionam, eu adoraria saber o porquê.
Aqui está minha hierarquia e restrições de exibição, para referência:
fonte
Como Eik diz,
UIStackView
eUIScrollView
jogue bem juntos, veja aqui .A chave é que ele
UIStackView
lida com a variável altura / largura para diferentes conteúdos e, emUIScrollView
seguida, faz seu trabalho bem ao rolar / saltar esse conteúdo:fonte
Eu estava olhando para fazer a mesma coisa e me deparei com este excelente post. Se você deseja fazer isso programaticamente usando a API âncora, este é o caminho a percorrer.
Para resumir, incorpore o seu
UIStackView
no seuUIScrollView
e defina as restrições de âncora doUIStackView
para coincidir com as doUIScrollView
:fonte
Atualizado para 2020.
Storyboard 100% OU código 100%.
Aqui está a explicação mais simples possível:
Tenha uma cena em tela cheia em branco
Adicione uma visualização de rolagem. Arraste com a tecla Control pressionada da visualização de rolagem para a visualização de base , adicione esquerda, direita, superior e inferior, todos os zero.
Adicione uma exibição de pilha na exibição de rolagem. Arraste com a tecla Control pressionada da exibição da pilha para a exibição de rolagem , adicione esquerda, direita, superior e inferior, todos os zero.
Coloque duas ou três etiquetas dentro da visualização da pilha.
Para maior clareza, torne a cor de fundo do rótulo vermelha. Defina a altura da etiqueta como 100.
Agora defina a largura de cada UILabel:
Surpreendentemente, arraste com o controle
UILabel
da exibição de rolagem, não da pilha e selecione larguras iguais .Repetir:
Não controle o arrasto do UILabel para o pai do UILabel - vá para o avô. (Em outras palavras, vá até a exibição de rolagem, não vá para a exibição de pilha.)
É simples assim. Esse é o segredo.
Você Terminou.
Dica: você deve adicionar uma altura a cada novo item . Cada item em qualquer exibição de pilha de rolagem deve ter um tamanho intrínseco (como um rótulo) ou adicionar uma restrição de altura explícita.
A abordagem alternativa:
Acima: surpreendentemente, defina as larguras dos UILabels com a largura da exibição de rolagem (não da exibição de pilha).
Como alternativa ...
Arraste da exibição de pilha para a exibição de rolagem e adicione uma restrição de "largura igual". Isso parece estranho porque você já fixou a esquerda-direita , mas é assim que você faz . Por mais estranho que pareça, esse é o segredo.
Então você tem duas opções:
ou
Para ser claro, execute um desses métodos, NÃO faça os dois.
fonte
Rolagem horizontal (UIStackView no UIScrollView)
Para rolagem horizontal. Primeiro, crie ae
UIStackView
aUIScrollView
e adicione-os à sua exibição da seguinte maneira:Lembre-se de definir o
translatesAutoresizingMaskIntoConstraints
parafalse
noUIStackView
e oUIScrollView
:Para que tudo funcione, as âncoras à direita, à esquerda e à direita
UIStackView
devem ser iguais àsUIScrollView
âncoras:Mas a âncora de largura do
UIStackView
mosto deve ser igual ou maior que a largura daUIScrollView
âncora:Agora ancore seu
UIScrollView
, por exemplo:Em seguida, sugiro tentar as seguintes configurações para o
UIStackView
alinhamento e distribuição:Finalmente, você precisará usar o
addArrangedSubview:
método para adicionar subviews ao seu UIStackView.Inserções de texto
Um recurso adicional que você pode achar útil é que, como o conteúdo
UIStackView
é mantido em um,UIScrollView
você agora tem acesso a inserções de texto para tornar as coisas um pouco mais bonitas.fonte
Basta adicionar isso a
viewdidload
:fonte: https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/LayoutUsingStackViews.html
fonte
Você pode tentar o ScrollableStackView : https://github.com/gurhub/ScrollableStackView
É uma biblioteca compatível com Objective-C e Swift. Está disponível através do CocoaPods .
Código de exemplo (Swift)
Código de exemplo (Objective-C)
fonte
Se você tiver uma restrição para centralizar a Vista de pilha verticalmente dentro da vista de rolagem, basta removê-la.
fonte
Exemplo para um stackview / scrollview vertical (usando o
EasyPeasy
for autolayout):Apenas certifique-se de que a altura de cada subvisão esteja definida!
fonte
Antes de tudo, projete sua visualização, de preferência em algo como Sketch ou tenha uma idéia do que você deseja como conteúdo rolável.
Depois disso, crie o controlador de exibição de forma livre (escolha no inspetor de atributos) e defina altura e largura de acordo com o tamanho do conteúdo intrínseco da sua exibição (a ser escolhido no inspetor de tamanho).
Depois disso, no controlador de exibição, coloque uma exibição de rolagem e isso é uma lógica, que eu descobri que funciona quase o tempo todo no iOS (pode ser necessário passar pela documentação dessa classe de exibição que pode ser obtida através do comando + clique em nessa aula ou no Google)
Se você estiver trabalhando com duas ou mais visualizações, inicie primeiro com uma visualização que foi introduzida anteriormente ou seja mais primitiva e, em seguida, vá para a visualização que foi introduzida posteriormente ou que é mais moderna. Então, aqui, desde que a exibição de rolagem foi introduzida primeiro, comece com a exibição de rolagem primeiro e depois vá para a exibição de pilha. Aqui, coloque as restrições da visualização de rolagem em zero em todas as direções em relação à sua super visualização. Coloque todas as suas visualizações nessa exibição de rolagem e, em seguida, coloque-as na exibição de pilha.
Ao trabalhar com a exibição de pilha
Primeiro, inicie com motivos de cima para baixo (abordagem de baixo para cima), ou seja, se você tiver rótulos, campos de texto e imagens em sua exibição, expanda essas exibições primeiro (dentro da exibição de rolagem) e depois coloque-as na exibição de pilha.
Depois disso, ajuste a propriedade da exibição de pilha. Se a visualização desejada ainda não for alcançada, use outra visualização da pilha.
Depois de fazer sua exibição, coloque uma restrição entre a exibição da pilha mãe e a exibição de rolagem, enquanto os filhos da restrição empilham a exibição com a exibição da pilha mãe. Esperançosamente, a essa altura, ele deve funcionar bem ou você pode receber um aviso do Xcode dando sugestões, leia o que diz e implemente-as. Espero que agora você tenha uma visão de trabalho de acordo com suas expectativas :).
fonte
Para a visualização de pilha aninhada ou única, a visualização de rolagem deve ser definida com uma largura fixa com a visualização raiz. A exibição da pilha principal que está dentro da exibição de rolagem deve definir a mesma largura. [Minha visualização de rolagem está abaixo de uma Visualização, ignore-a]
fonte
Se alguém procurar horizontalmente scrollview
fonte
Coloque uma exibição de rolagem em sua cena e dimensione-a para que ela preencha a cena. Em seguida, coloque uma vista de pilha dentro da vista de rolagem e coloque o botão adicionar item dentro da vista de pilha. Assim que tudo estiver no lugar, defina as seguintes restrições:
código:
Stack View.Width = Scroll View.Width
é a chave.fonte
Adicionando uma nova perspectiva para o macOS Catalyst. Como os aplicativos macOS suportam o redimensionamento de janelas, é possível que você
UIStackView
faça a transição de um status não rolável para um status rolável ou vice-versa. Há duas coisas sutis aqui:UIStackView
foi projetado para caber em todas as áreas possíveis.UIScrollView
tentará redimensionar seus limites para dar conta da área recém-adquirida / perdida sob a barra de navegação (ou barra de ferramentas no caso de aplicativos macOS).Infelizmente, isso criará um loop infinito. Eu não estou extremamente familiarizado com isso
UIScrollView
eadjustedContentInset
, mas do meu log nolayoutSubviews
método, estou vendo o seguinte comportamento:UIScrollView
tenta reduzir seus limites (já que não há necessidade da área abaixo da barra de ferramentas).UIStackView
segue.UIScrollView
está insatisfeito e decide restaurar os limites maiores. Isso me parece muito estranho, pois o que estou vendo no log é issoUIScrollView.bounds.height == UIStackView.bounds.height
.UIStackView
segue.Parece-me que duas etapas resolveriam o problema:
UIStackView.top
aUIScrollView.topMargin
.contentInsetAdjustmentBehavior
como.never
.Aqui estou preocupado com uma exibição verticalmente rolável com um crescimento vertical
UIStackView
. Para um par horizontal, altere o código adequadamente.Espero que ajude alguém no futuro. Não foi possível encontrar alguém mencionando isso na Internet e me custou muito tempo para descobrir o que aconteceu.
fonte