Estou tentando descobrir isso desde a semana passada sem dar um passo adiante. Ok, então eu preciso aplicar algumas restrições programaticamente no Swift a um UIView
usando este código:
var new_view:UIView! = UIView(frame: CGRectMake(0, 0, 100, 100));
new_view.backgroundColor = UIColor.redColor();
view.addSubview(new_view);
var constX:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0);
self.view.addConstraint(constX);
var constY:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0);
self.view.addConstraint(constY);
var constW:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: new_view, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0);
self.view.addConstraint(constW);
var constH:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: new_view, attribute: NSLayoutAttribute.Height, multiplier: 1, constant: 0);
self.view.addConstraint(constH);
Mas o Xcode retorna esta saída estranha:
2014-10-03 09:48:12.657 Test[35088:2454916] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7fa4ea446830 UIView:0x7fa4ea429290.centerX == UIView:0x7fa4ea4470f0.centerX>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea4516c0 h=--& v=--& UIView:0x7fa4ea429290.midX == + 50>",
"<NSLayoutConstraint:0x7fa4ea452830 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fa4ea4470f0(375)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea446db0 h=-&- v=-&- 'UIView-Encapsulated-Layout-Left' H:|-(0)-[UIView:0x7fa4ea4470f0] (Names: '|':UIWindow:0x7fa4ea444b20 )>"
)
Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fa4ea446830 UIView:0x7fa4ea429290.centerX == UIView:0x7fa4ea4470f0.centerX>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in
<UIKit/UIView.h> may also be helpful.
2014-10-03 09:48:12.658 Test[35088:2454916] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7fa4ea44d160 UIView:0x7fa4ea429290.centerY == UIView:0x7fa4ea4470f0.centerY>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea451b30 h=--& v=--& UIView:0x7fa4ea429290.midY == + 50>",
"<NSLayoutConstraint:0x7fa4ea44cf00 'UIView-Encapsulated-Layout-Height' V:[UIView:0x7fa4ea4470f0(667)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea452700 h=-&- v=-&- 'UIView-Encapsulated-Layout-Top' V:|-(0)-[UIView:0x7fa4ea4470f0] (Names: '|':UIWindow:0x7fa4ea444b20 )>"
)
Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fa4ea44d160 UIView:0x7fa4ea429290.centerY == UIView:0x7fa4ea4470f0.centerY>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
Pode me ajudar? Muito obrigado
ios
swift
uiview
autolayout
nslayoutconstraint
Sara Canducci
fonte
fonte
>
. Eu consertei isso para você neste momento.Respostas:
Você planeja ter um quadrado
UIView
de largura: 100 e Altura: 100 centrado dentroUIView
de umUIViewController
? Nesse caso, você pode tentar um dos 6 seguintes estilos de Layout automático (Swift 5 / iOS 12.2):1. Usando o
NSLayoutConstraint
inicializador2. Usando a linguagem de formato visual
3. Usando uma mistura de
NSLayoutConstraint
inicializador e Visual Format Language4. Usando
UIView.AutoresizingMask
Nota: Molas e suportes serão convertidos em restrições de layout automático correspondentes em tempo de execução.
5. Usando
NSLayoutAnchor
6. Usando
intrinsicContentSize
eNSLayoutAnchor
Resultado:
fonte
newView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor).active = true
newView.translatesAutoresizingMaskIntoConstraints = false
parte! Demorei um pouco para ver.Isso me ajuda a aprender visualmente, então essa é uma resposta suplementar.
Código padrão
Cada um dos exemplos a seguir é independente dos outros.
Fixar borda esquerda
myView.leading = leadingMargin + 20
Método 1: Estilo Anchor
leadingAnchor
, há tambémtrailingAnchor
,topAnchor
ebottomAnchor
.Método 2: estilo NSLayoutConstraint
.leading
há também.trailing
,.top
e.bottom
..leadingMargin
há também.trailingMargin
,.topMargin
e.bottomMargin
.Definir largura e altura
width = 200
height = 100
Método 1: Estilo Anchor
Método 2: estilo NSLayoutConstraint
Centro no recipiente
myView.centerX = centerX
myView.centerY = centerY
Método 1: Estilo Anchor
Método 2: estilo NSLayoutConstraint
Notas
NSLayoutConstraint
estilo; no entanto, ele só está disponível no iOS 9; portanto, se você suporta o iOS 8, ainda deve usar oNSLayoutConstraint
estilo.myView
no meu projeto de teste, eu precisava ter quatro restrições.Leitura adicional
fonte
leading
vs.centerX
deve ser especificada.addConstraint()
sobreview
a fim de fazer as layoutconstraints registo.Se você deseja preencher sua super visão, sugiro a maneira mais rápida:
Caso contrário, se você precisar de restrições não iguais, confira o NSLayoutAnchor a partir do iOS 9. Geralmente, é muito mais fácil ler isso usando o NSLayoutConstraint diretamente:
fonte
isActive = true
nem sempre é uma boa ideia. É melhor e mais eficiente agrupar as restrições relacionadas em uma e ativá-las todas de uma vezNSLayoutConstraint.activate
.Restrições para várias visualizações no playground.
rápido 3+
fonte
O problema, como sugere a mensagem de erro, é que você tem restrições do tipo
NSAutoresizingMaskLayoutConstraints
que entram em conflito com as restrições explícitas, porquenew_view.translatesAutoresizingMaskIntoConstraints
estão definidas como true.Essa é a configuração padrão para as visualizações criadas no código. Você pode desativá-lo assim:
Além disso, suas restrições de largura e altura são estranhas. Se você deseja que a vista tenha uma largura constante, esta é a maneira correta:
(Substitua 100 pela largura que deseja).
Se o seu destino de implantação for o iOS 9.0 ou posterior, você poderá usar este código mais curto:
De qualquer forma, para um layout como este (tamanho fixo e centralizado na visualização pai), seria mais simples usar a máscara de redimensionamento automático e permitir que o sistema traduza a máscara em restrições:
Observe que o uso do redimensionamento automático é perfeitamente legítimo, mesmo quando você também está usando o autolayout. (O UIKit ainda usa o dimensionamento automático em vários locais internamente.) O problema é que é difícil aplicar restrições adicionais a uma exibição que está usando o dimensionamento automático.
fonte
Basicamente, envolveu 3 etapas
Isso coloca o rótulo "olá mundo" no centro da tela.
Consulte o link Restrições de reprodução automática programaticamente
fonte
Atualizado para o Swift 3
Tipo de restrições
fonte
O layout automático é realizado aplicando restrições nas imagens. Use NSLayoutConstraint. É possível implementar um design ideal e bonito em todos os dispositivos. Por favor, tente o código abaixo.
fonte
é um pouco diferente no xcode 7.3.1. é isso que eu proponho
fonte
Gostaria de acrescentar algum conceito teórico à resposta de Imanou Petit, para que se possa entender como o layout automático funciona.
Para entender o layout automático, considere sua visão como o objeto de borracha que é reduzido inicialmente.
Para colocar um objeto na tela, precisamos de 4 itens obrigatórios:
Coordenada X do objeto (posição horizontal).
Coordenada Y do objeto (posição vertical)
Largura do objeto
Altura do objeto.
1 Coordenada X: existem várias maneiras de atribuir coordenadas x a uma exibição.
Como restrição principal, restrição à direita, centro horizontal etc.
2 Coordenada Y: existem várias maneiras de fornecer coordenadas y a uma exibição:
Como restrição superior, restrição inferior, centro vertical etc.
3 Largura do objeto: Existem duas maneiras de restringir a largura a uma vista:
uma. Adicione restrição de largura fixa (considere essa restrição como barra de ferro de largura fixa e você prendeu o objeto de borracha horizontalmente a ele para que o objeto não encolha ou expanda)
b. Não adicione nenhuma restrição de largura, mas adicione a restrição de coordenadas x ao final da visão, à direita e à esquerda; essas duas restrições expandirão / encolherão o objeto de borracha, puxando / empurrando-o da extremidade, da frente e do final.
4 Altura do objeto: Semelhante à largura, também existem duas maneiras de restringir a altura de uma vista:
uma. Adicione restrição de altura fixa (considere essas restrições como uma barra de ferro de altura fixa e você prendeu o objeto de borracha verticalmente a ele para que o objeto não encolha ou expanda)
b. Não adicione nenhuma restrição de altura, mas adicione a restrição de coordenadas x nas extremidades superior e inferior da visão, essas duas restrições expandirão / reduzirão o objeto de borracha, puxando / empurrando-o das extremidades, superior e inferior.
fonte
fonte
Essa é uma maneira de adicionar restrições programaticamente
fonte
Você está adicionando todas as restrições definidas às
self.view
quais está incorreta, pois as restrições de largura e altura devem ser adicionadas à suanewView
.Além disso, como eu entendo, você deseja definir largura e altura constantes 100: 100. Nesse caso, você deve alterar seu código para:
fonte
Se você achar que o acima é feio. Você deve considerar o uso de uma DSL para restrições. Como o SnapKit, torna a API de restrição muito mais amigável
fonte
Podemos fazer isso facilmente com o rápido 5.1
configuração 1
subview largura altura definida usando float
configuração 2
largura da subvisualização definida usando a altura da largura da visualização
fonte
Experimente esta elegante
UIView
extensão de restrições. Você pode fazer restrições facilmente como:Aqui está a extensão, basta copiá-la para o seu projeto.
fonte