Creé dos vistas en una supervista, y luego agregué restricciones entre las vistas:
_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];
Ahora quiero cambiar la propiedad del multiplicador con animación, pero no puedo entender cómo cambiar la propiedad del multiplicador. (Encontré _coefficient en propiedad privada en el archivo de cabecera NSLayoutConstraint.h, pero es privado).
¿Cómo cambio la propiedad del multiplicador?
Mi solución es eliminar la restricción anterior y agregar la nueva con un valor diferente para multipler
.
ios
iphone
objective-c
nslayoutconstraint
Bimawa
fuente
fuente
Respuestas:
Si solo tiene dos conjuntos de multiplicadores que deben aplicarse, desde iOS8 en adelante puede agregar ambos conjuntos de restricciones y decidir cuál debe estar activo en cualquier momento:
Versión Swift 5.0
fuente
addConstraint(_:)
yremoveConstraint(_:)
en la vista que es el ancestro común más cercano de los elementos administrados por esta restricción".Aquí hay una extensión NSLayoutConstraint en Swift que hace que configurar un nuevo multiplicador sea bastante fácil:
En Swift 3.0+
Uso de demostración:
fuente
NSLayoutConstraint.deactivateConstraints([self])
debe hacerse antes de crearnewConstraint
, de lo contrario puede dar lugar a una advertencia: no se pueden satisfacer las restricciones simultáneamente . TambiénnewConstraint.active = true
es innecesario ya queNSLayoutConstraint.activateConstraints([newConstraint])
hace exactamente lo mismo.cloneWithMultiplier
hacerlo más explícito que no solo aplica efectos secundarios, sino que devuelve una nueva restricción0.0
no podrá actualizarlo nuevamente.La
multiplier
propiedad es de solo lectura. Debe eliminar la antigua NSLayoutConstraint y reemplazarla por una nueva para modificarla.Sin embargo, dado que sabe que desea cambiar el multiplicador, puede cambiar la constante multiplicándola usted mismo cuando sea necesario realizar cambios, que a menudo es menos código.
fuente
View2.bottomY
el valor actual para calcular la nueva constante de la restricción . Eso es defectuoso, ya queView2.bottomY
el valor anterior se horneará en la constante, por lo que debe renunciar al estilo declarativo y actualizar manualmente la restricción en cualquier momento queView2.bottomY
cambie. En este caso, también puede hacer el diseño manual.Una función auxiliar que uso para cambiar el multiplicador de una restricción de diseño existente. Crea y activa una nueva restricción y desactiva la anterior.
Uso, cambiando el multiplicador a 1.2:
fuente
NSLayoutConstraint.deactivate
la función es solo iOS 8.0+.Versión Objective-C para la respuesta de Andrew Schreiber
Cree la categoría para la clase NSLayoutConstraint y agregue el método en un archivo .h como este
En el archivo .m
Más adelante en ViewController, cree la salida para la restricción que desea actualizar.
y actualiza el multiplicador donde quieras como a continuación.
fuente
active = true
es lo mismo que activar y, por lo tanto, hace que se agregue una restricción duplicada antes de que se llame a desactivar, esto causa un error de restricciones en algunos escenarios.En su lugar, puede cambiar la propiedad "constante" para lograr el mismo objetivo con un poco de matemática. Suponga que su multiplicador predeterminado en la restricción es 1.0f. Este es el código Xamarin C # que se puede traducir fácilmente a Objective-C
fuente
Como se explica en otras respuestas: debe eliminar la restricción y crear una nueva.
Puede evitar devolver una nueva restricción creando un método estático para
NSLayoutConstraint
con elinout
parámetro, que le permite reasignar la restricción pasadaEjemplo de uso:
fuente
NINGUNO DEL CÓDIGO ANTERIOR TRABAJÓ PARA MÍ, DESPUÉS DE INTENTAR MODIFICAR MI PROPIO CÓDIGO ESTE CÓDIGO Este código funciona en Xcode 10 y swift 4.2
fuente
Sí, puede cambiar los valores del multiplicador, simplemente haga una extensión de NSLayoutConstraint y úsela como ->
fuente
Cambie cambiando la restricción activa en el código como lo sugieren muchas otras respuestas no funcionó para mí. Así que creé 2 restricciones, una instalada y la otra no, unir ambas al código y luego cambiar eliminando una y agregando la otra.
En aras de la integridad, para vincular la restricción, arrastre la restricción al código con el botón derecho del mouse, como cualquier otro elemento gráfico:
Llamé una proporción IPad y la otra proporción IPhone.
Luego, agregue el siguiente código, en viewDidLoad
Estoy usando xCode 10 y swift 5.0
fuente
Aquí hay una respuesta basada en la respuesta de @ Tianfu en C #. Otras respuestas que requieren activación y desactivación de restricciones no funcionaron para mí.
fuente
Para cambiar el valor del multiplicador, siga los pasos a continuación: 1. cree salidas para la restricción requerida, por ejemplo, someConstraint. 2. cambie el valor del multiplicador como someConstraint.constant * = 0.8 o cualquier valor multiplicador.
eso es todo, feliz codificación.
fuente
Uno puede leer:
en esta página de documentación . ¿No significa eso que uno debería poder modificar el multiplicador (ya que es una var)?
fuente
var multiplier: CGFloat { get }
es la definición que significa que solo tiene un captador.