Ao usar Layout automático no código, a configuração do quadro não faz nada. Portanto, o fato de você ter especificado uma largura de 200 na vista acima não significa nada quando você define restrições nela. Para que o conjunto de restrições de uma visualização não seja ambíguo, são necessárias quatro coisas: uma posição x, uma posição y, uma largura e uma altura para qualquer estado dado.
Atualmente, no código acima, você tem apenas dois (altura, em relação à supervisualização e posição y, em relação à supervisualização). Além disso, você tem duas restrições necessárias que podem entrar em conflito, dependendo de como as restrições da visão geral da visualização são configuradas. Se a supervisualização tivesse uma restrição necessária que especifica que sua altura seja um valor menor que 748, você receberá uma exceção de "restrições insatisfatórias".
O fato de você definir a largura da visualização antes de definir as restrições não significa nada. Ele nem mesmo levará em consideração o quadro antigo e calculará um novo quadro com base em todas as restrições que especificou para essas visualizações. Ao lidar com autolayout no código, normalmente apenas crio uma nova visualização usando initWithFrame:CGRectZero
ou simplesmente init
.
Para criar o conjunto de restrições necessário para o layout que você descreveu verbalmente em sua pergunta, você precisaria adicionar algumas restrições horizontais para limitar a largura e a posição x, a fim de fornecer um layout totalmente especificado:
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-[myView(>=748)]-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:[myView(==200)]-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
A descrição verbal desse layout é a seguinte, começando com a restrição vertical:
myView preencherá a altura de seu superview com um preenchimento superior e inferior igual ao espaço padrão. O superview do myView tem uma altura mínima de 748 pontos. A largura de myView é 200pts e tem um preenchimento à direita igual ao espaço padrão contra sua visão panorâmica.
Se você simplesmente quiser que a visualização preencha toda a altura da supervisualização sem restringir a altura da supervisualização, então você simplesmente omite o (>=748)
parâmetro no texto de formato visual. Se você acha que o (>=748)
parâmetro é necessário para dar a ele uma altura - você não acha neste caso: fixando a visualização nas bordas da supervisualização usando a sintaxe de barra ( |
) ou barra com espaço ( |-
, -|
), você está atribuindo um y à sua visualização -position (fixando a vista em uma única aresta), e uma posição y com altura (fixando a vista em ambas as arestas), satisfazendo assim seu conjunto de restrições para a vista.
Em relação à sua segunda pergunta:
Usando NSDictionaryOfVariableBindings(self.myView)
(se você tiver uma configuração de propriedade para myView) e alimentando-a em seu VFL para usar self.myView
em seu texto VFL, você provavelmente obterá uma exceção quando o autolayout tentar analisar seu texto VFL. Tem a ver com a notação de ponto nas chaves do dicionário e com o sistema que tenta usar valueForKeyPath:
. Veja aqui uma pergunta e resposta semelhantes .