Estou tentando adicionar modos de exibição no UIStackView programaticamente. Por enquanto, meu código é:
UIView *view1 = [[UIView alloc]init];
view1.backgroundColor = [UIColor blackColor];
[view1 setFrame:CGRectMake(0, 0, 100, 100)];
UIView *view2 = [[UIView alloc]init];
view2.backgroundColor = [UIColor greenColor];
[view2 setFrame:CGRectMake(0, 100, 100, 100)];
[self.stack1 addArrangedSubview:view1];
[self.stack1 addArrangedSubview:view2];
Quando implanto o aplicativo, há apenas 1 visualização e ela é na cor preta. (View1 também obtém os parâmetros para view2)
ios
objective-c
ios9
uistackview
Altimir Antonov
fonte
fonte
addArrangedSubview:
, notaddSubview:
Respostas:
As visualizações de pilha usam tamanho de conteúdo intrínseco; portanto, use restrições de layout para definir as dimensões das visualizações.
Existe uma maneira fácil de adicionar restrições rapidamente (exemplo):
Código completo:
Nota: Isso foi testado no iOS 9
fonte
UIViews
que não. Se o pôster original tivesse usadoUILabel
instâncias em vez deUIView
, seu código teria funcionado como ele esperava. Eu adicionei um exemplo que demonstra isso abaixo.Swift 5.0
Com base na resposta @ user1046037.
fonte
activate(_:)
, e é normalmente mais eficiente de fazê-lo desta forma developer.apple.com/documentation/uikit/nslayoutconstraint/...UIStackView
usa restrições internamente para posicionar suas subvisões organizadas. Exatamente quais restrições são criadas depende de como a própria exibição da pilha está configurada. Por padrão, uma exibição de pilha criará restrições que exibem suas subvisões organizadas em uma linha horizontal, fixando as vistas iniciais e finais às suas próprias arestas iniciais e finais. Portanto, seu código produziria um layout parecido com este:O espaço alocado para cada subvisão é determinado por vários fatores, incluindo o tamanho do conteúdo intrínseco da subvisão e sua resistência à compactação e prioridades de abrangência de conteúdo. Por padrão, as
UIView
instâncias não definem um tamanho de conteúdo intrínseco. Isso geralmente é fornecido por uma subclasse, comoUILabel
ouUIButton
.Como a resistência à compactação de conteúdo e as prioridades de abrangência de conteúdo de duas novas
UIView
instâncias serão as mesmas, e nenhuma visualização fornece um tamanho intrínseco de conteúdo, o mecanismo de layout deve adivinhar qual tamanho deve ser alocado para cada visualização. No seu caso, ele está atribuindo a primeira visualização 100% do espaço disponível, e nada para a segunda visualização.Se você modificar seu código para usar
UILabel
instâncias, obterá melhores resultados:Observe que não é necessário criar explicitamente nenhuma restrição. Esse é o principal benefício do uso
UIStackView
- oculta os detalhes (geralmente feios) do gerenciamento de restrições do desenvolvedor.fonte
UIView
si só não têm um tamanho intrínseco. Pode ser necessário aplicar restrições adicionais a essas visualizações, para que a visualização da pilha saiba o tamanho delas.MyTextField.top = top+20
ebottom = MyTextField.bottom+20
. Eu esperaria que isso desse à minha opinião uma altura intrínseca de 70, mas, em vez disso, reclama de restrições conflitantes. Você sabe o que está acontecendo aqui? É essa visão que eu quero colocar dentro do meu UIStackView.No Swift 4.2
fonte
Você precisa definir seu tipo de distribuição. No seu código, juste adicione:
Ou você pode definir a distribuição diretamente no seu construtor de interface. Por exemplo:
Espero que ajude;) Lapinou.
fonte
Após duas linhas, meu problema foi corrigido
Versão Swift -
fonte
Para a resposta aceita ao tentar ocultar qualquer exibição dentro da exibição de pilha, a restrição não está correta.
A razão é que, quando ocultar o
view
,stackView
ele definirá a altura como 0 para animá-lo.Solução altere a restrição
priority
como abaixo.fonte
Melhorado na resposta por @Oleg Popov
fonte
No meu caso, o que eu estava mexendo seria que eu estava perdendo essa linha:
Depois disso, não há necessidade de definir restrições para minhas subvisões organizadas, o stackview está cuidando disso.
fonte
Versão Swift 5 da resposta de Oleg Popov , que é baseada na resposta de user1046037
fonte
Acabei de me deparar com um problema muito semelhante. Assim como mencionado antes, as dimensões da visualização da pilha dependem de um tamanho de conteúdo intrínseco das subvisões organizadas. Aqui está minha solução no Swift 2.xe seguinte estrutura de exibição:
view - UIView
customView - CustomView: UIView
stackView - UISTackView
subvisões organizadas - subclasses personalizadas do UIView
fonte
Experimente o código abaixo,
Espero que funcione. Entre em contato se precisar de mais esclarecimentos.
fonte