Atualmente, não, não parece possível centralizar uma visualização na superview usando apenas VFL. No entanto, não é tão difícil fazê-lo usando uma única string VFL e uma única restrição extra (por eixo):
VFL: "|-(>=20)-[view]-(>=20)-|"
[NSLayoutConstraint constraintWithItem:view
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:view.superview
attribute:NSLayoutAttributeCenterX
multiplier:1.f constant:0.f];
Alguém poderia pensar que você seria capaz de fazer isso (que é o que eu inicialmente pensei e tentei quando vi essa pergunta):
[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>=20)-[view(==200)]-(>=20)-|"
options: NSLayoutFormatAlignAllCenterX | NSLayoutFormatAlignAllCenterY
metrics:nil
views:@{@"view" : view}];
Tentei muitas variações diferentes das anteriores, tentando dobrá-las à minha vontade, mas isso não parece se aplicar à superview, mesmo quando há explicitamente duas seqüências de caracteres VFL separadas para os dois eixos ( H:|V:
). Comecei a tentar isolar exatamente quando as opções não são aplicadas para o VFL. Eles parecem não se aplicar à superview no VFL e somente se aplicam a quaisquer visualizações explícitas mencionadas na string VFL (o que é decepcionante em certos casos).
Espero que, no futuro, a Apple adicione algum tipo de nova opção para que as opções do VFL levem em conta a superview, mesmo que apenas quando houver apenas uma única exibição explícita além da superview no VFL. Outra solução poderia ser outra opção passado para o VFL que diz algo como: NSLayoutFormatOptionIncludeSuperview
.
Desnecessário dizer que aprendi muito sobre o VFL tentando responder a essa pergunta.
|
e[superview]
como entidades internas separadas, embora representem o mesmo objeto semântico. Ao usar[superview]
, o autolayout inclui o objeto superview em suas métricas de alinhamento (no caso de sua resposta no link do github, é aNSLayoutFormatAlignAllCenterY
/X
métrica).Sim, é possível centralizar uma visualização em sua superview com Visual Format Language. Vertical e horizontalmente. Aqui está a demonstração:
https://github.com/evgenyneu/center-vfl
fonte
Eu acho que é melhor criar manualmente restrições.
Agora podemos usar o NSLayoutAnchor para definir programaticamente o AutoLayout:
(Disponível no iOS 9.0 e posterior)
Eu recomendo usar o SnapKit , que é um DSL para facilitar o Auto Layout no iOS e no macOS.
fonte
Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.
Absolutamente possível foi capaz de fazê-lo assim:
Aprendi isso daqui. O código acima centraliza a subvisão à vista de Y, obviamente.
Swift3:
fonte
Adicione o código abaixo e coloque seu botão no centro da tela. Absolutamente possível.
fonte
Eu sei que não é o que você deseja, mas é claro que você pode calcular as margens e usá-las para criar a string de formato visual;)
Enfim, não. Infelizmente, não é possível fazer isso 'automaticamente' com o VFL - pelo menos ainda não.
fonte
Graças à resposta do @Evgenii, crio um exemplo completo no gist:
centralize o quadrado vermelho verticalmente com altura personalizada
https://gist.github.com/yallenh/9fc2104b719742ae51384ed95dcaf626
Você pode centralizar uma vista verticalmente usando VFL (que não é muito intuitivo) ou usar restrições manualmente. A propósito, não posso combinar o centerY e a altura no VFL, como:
Na solução atual, as restrições de VFL são adicionadas separadamente.
fonte
O que é necessário fazer é que a superview seja declarada no dicionário. Em vez de usar
|
você usa@{@"super": view.superview};
.E
NSLayoutFormatAlignAllCenterX
para vertical eNSLayoutFormatAlignAllCenterY
horizontal como opções.fonte
Você pode usar visualizações extras.
Se você quiser arrumado, então
centerXView.hidden = centerYView.hidden = YES;
.PS: Não sei se posso chamar as visualizações extras de "espaços reservados", porque o inglês é meu segundo idioma. Será apreciado se alguém puder me dizer isso.
fonte
Para aqueles que vieram aqui em busca de uma
Interface Builder
solução baseada (o Google me leva aqui), basta adicionar restrições de largura / altura const e selecione a subview -> control arraste para sua superview -> selecione "center vertical / horizontal in superview".fonte
Este é o meu método
fonte
Só preciso dizer que você pode usar isso em vez de restrições:
fonte
@ resposta igor-muzyka no Swift 2 :
fonte
Em vez de usar o VFL, você pode fazer isso facilmente no construtor de interfaces. No Storyboard principal, pressione a tecla Ctrl e clique na vista que você deseja centralizar. Arraste para a superview (mantendo pressionada a tecla ctrl) e selecione "Center X" ou "Center Y". Nenhum código é necessário.
fonte