Criei duas visualizações em uma superview e adicionei restrições entre as visualizações:
_indicatorConstrainWidth = [NSLayoutConstraint constraintWithItem:self.view1 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view2 attribute:NSLayoutAttributeWidth multiplier:1.0f constant:0.0f];
[_indicatorConstrainWidth setPriority:UILayoutPriorityDefaultLow];
_indicatorConstrainHeight = [NSLayoutConstraint constraintWithItem:self.view1 attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view2 attribute:NSLayoutAttributeHeight multiplier:1.0f constant:0.0f];
[_indicatorConstrainHeight setPriority:UILayoutPriorityDefaultLow];
[self addConstraint:_indicatorConstrainWidth];
[self addConstraint:_indicatorConstrainHeight];
Agora, quero alterar a propriedade do multiplicador com animação, mas não consigo descobrir como alterar a propriedade do multiplicador. (Encontrei _coeficiente na propriedade privada no arquivo de cabeçalho NSLayoutConstraint.h, mas é privado.)
Como altero a propriedade do multiplicador?
Minha solução alternativa é remover a restrição antiga e adicionar a nova com um valor diferente para multipler
.
ios
iphone
objective-c
nslayoutconstraint
Bimawa
fonte
fonte
Respostas:
Se você tiver apenas dois conjuntos de multiplicadores que precisam ser aplicados, a partir do iOS8 , poderá adicionar os dois conjuntos de restrições e decidir qual deve estar ativo a qualquer momento:
Versão Swift 5.0
fonte
addConstraint(_:)
eremoveConstraint(_:)
na exibição que é o ancestral comum mais próximo dos itens gerenciados por essa restrição".Aqui está uma extensão NSLayoutConstraint no Swift que facilita bastante a configuração de um novo multiplicador:
No Swift 3.0 ou superior
Uso de demonstração:
fonte
NSLayoutConstraint.deactivateConstraints([self])
deve ser feito antes da criaçãonewConstraint
, caso contrário, poderá resultar em aviso: Não é possível satisfazer simultaneamente as restrições . TambémnewConstraint.active = true
é desnecessário, poisNSLayoutConstraint.activateConstraints([newConstraint])
faz exatamente a mesma coisa.cloneWithMultiplier
para torná-lo mais explícito que não se aplica apenas efeitos colaterais, mas sim retorna uma nova restrição0.0
você não poderá atualizá-lo novamente.A
multiplier
propriedade é somente leitura. Você precisa remover o NSLayoutConstraint antigo e substituí-lo por um novo para modificá-lo.No entanto, como você sabe que deseja alterar o multiplicador, basta alterar a constante multiplicando-a quando for necessário, o que geralmente é menos código.
fonte
View2.bottomY
o valor atual para calcular a nova constante da restrição . Isso é defeituoso, já queView2.bottomY
o valor antigo será cozido na constante, portanto, você deve abandonar o estilo declarativo e atualizar manualmente a restrição a qualquer momentoView2.bottomY
. Nesse caso, você também pode fazer o layout manual.Uma função auxiliar que eu uso para alterar o multiplicador de uma restrição de layout existente. Ele cria e ativa uma nova restrição e desativa a antiga.
Uso, alterando o multiplicador para 1,2:
fonte
NSLayoutConstraint.deactivate
A função é apenas para iOS 8.0 ou superior.Versão Objective-C para resposta de Andrew Schreiber
Crie a categoria para a classe NSLayoutConstraint e adicione o método no arquivo .h como este
No arquivo .m
Posteriormente, no ViewController, crie a saída para a restrição que você deseja atualizar.
e atualize o multiplicador onde quiser abaixo.
fonte
active = true
é o mesmo que ativar e, portanto, faz com que uma restrição duplicada seja adicionada antes que a desativação seja chamada, isso causa um erro de restrições em alguns cenários.Você pode alterar a propriedade "constant" para obter o mesmo objetivo com um pouco de matemática. Suponha que seu multiplicador padrão na restrição seja 1.0f. Este é o código Xamarin C # que pode ser facilmente traduzido para o objetivo-c
fonte
Como está em outras respostas explicadas: Você precisa remover a restrição e criar uma nova.
Você pode evitar o retorno de nova restrição criando um método estático para
NSLayoutConstraint
com oinout
parâmetro, o que permite reatribuir a restrição passadaExemplo de uso:
fonte
NENHUM CÓDIGO ACIMA FUNCIONOU PARA MIM, APÓS TENTAR MODIFICAR MEU PRÓPRIO CÓDIGO ESTE CÓDIGO Este código está funcionando no Xcode 10 e no swift 4.2
fonte
Sim, podemos alterar os valores do multiplicador, basta fazer uma extensão do NSLayoutConstraint e usá-lo como ->
fonte
Mudar, alterando a restrição ativa no código, conforme sugerido por muitas outras respostas, não funcionou para mim. Então, eu criei 2 restrições, uma instalada e a outra não, vincule ambas ao código e mude removendo uma e adicionando a outra.
Por uma questão de completude, para vincular a restrição, arraste a restrição para o código usando o botão direito do mouse, como qualquer outro elemento gráfico:
Eu nomeei um proporcionadoIPad e outro proporcionadoIPhone.
Em seguida, adicione o seguinte código, em viewDidLoad
Estou usando o xCode 10 e o swift 5.0
fonte
Aqui está uma resposta baseada na resposta do @ Tianfu em C #. Outras respostas que exigem ativação e desativação de restrições não funcionaram para mim.
fonte
Para alterar o valor do multiplicador, siga as etapas abaixo: 1. crie saídas para a restrição necessária, por exemplo, someConstraint. 2. altere o valor do multiplicador como someConstraint.constant * = 0,8 ou qualquer valor do multiplicador.
é isso, codificação feliz.
fonte
Pode-se ler:
nesta página de documentação . Isso não significa que alguém deve ser capaz de modificar o multiplicador (já que é um var)?
fonte
var multiplier: CGFloat { get }
é a definição que significa que ele tem apenas um getter.