2017-04-18 1 views
0

J'ai figuré tiré mes cheveux sur celui-ci. J'ai lu dans cet article "http://gregshackles.com/fluentlayout-2-5/" que FluentLayout supporte désormais l'édition/suppression de contraintes mais cela ne semble pas fonctionner de ma part. Mon scénario consiste à basculer la visibilité d'un champ de texte dans un UIView lorsqu'un bouton est cliqué.Comment modifier une contrainte en utilisant mvvmcross fluentLayout

J'ai essayé ce qui suit.

A. Modification de la contrainte de hauteur

var height = isVisible ? textfield.Height().EqualTo(0) : textfield.WithSameHeight(textfieldContainer).Multiplier(1/3); 
      textfieldContainer.Add(textfield); 
      textfieldContainer.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints(); 
      textfieldContainer.AddConstraints(
        textfield.WithSameLeft(textfieldContainer).Plus(12), 
        textfield.WithSameTop(textfieldContainer).Plus(24), 
        textfield.WithSameWidth(textfieldContainer), 
        height 
       ); 

B. Utilisation SetActive (false) - Essayé ce désespoir de cause

textfieldContainer.Add(textfield); 
      textfieldContainer.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints(); 
      textfieldContainer.AddConstraints(
        textfield.WithSameLeft(textfieldContainer).Plus(12).SetActive(!isVisible), 
        textfield.WithSameTop(textfieldContainer).Plus(24).SetActive(!isVisible), 
        textfield.WithSameWidth(textfieldContainer).SetActive(!isVisible), 
        textfield.WithSameHeight(textfieldContainer).WithMultiplier(1/4).SetActive(!isVisible) 
       ); 

Résultat attendu

Le textfield devrait être visible en fonction de la visibilité

de résultat réel

hauteur du champ de texte ne change jamais, il est donc toujours visible

Répondre

2

Je pense que votre variable height est réglée une fois au cours du cycle de vie de la page, et ne reçoit pas changer après ce point. Une façon de parvenir à ce que vous avez besoin est la suivante:

Tout d'abord, lier votre bouton cliquez pour une commande qui modifie l'état d'un boolean sur votre ViewModel, afin que les changements de valeur de boolean lorsque le bouton est cliqué:

bindingSet.Bind(yourButton).To(vm => vm.YourCommand);

MvxCommand _yourCommand; 
public MvxCommand YourCommand 
    => _yourCommand ?? _yourCommand = new MvxCommand(ReverseMyBool); 

void ReverseMyBool() 
{ 
    YourBoolean = !YourBoolean; 
} 

Si nécessaire, définissez YourBoolean true lors de la construction de votre ViewModel, selon que votre souhaitez que le champ soit caché pendant le chargement de la page.Maintenant que la propriété ViewModel contient un état vrai/faux précis pour savoir si votre UITextField doit être masqué, liez le UITextField lui-même pour Hidden au booléen (vous devrez peut-être utiliser un value converter pour inverser la valeur - si Hidden est true, la vue est invisible):

bindingSet.Bind(textfield).For(c => c.Hidden).To(vm => vm.YourBoolean); 

Ensuite, créez FluentLayout variables qui se rapportent aux deux situations (votre point de vue étant visible et étant caché), et appliquer les deux:

var textFieldWithOneThirdContainerHeight = textfield.WithSameHeight(textFieldContainer).WithMultiplier(1f /3f); 
var textFieldWithZeroHeight = textField.Height().EqualTo(0f); 

textfieldContainer.AddConstraints(textFieldWithOneThirdContainerHeight, textFieldWithZeroHeight, /*other constraints here*/); 

et enfin, lier la contrainte s pour Active à la boolean sur votre ViewModel - noter que l'on aura besoin d'être inversée avec un convertisseur:

bindingSet.Bind(textFieldWithOneThirdContainerHeight).For(c => c.Active).To(vm => vm.YourBoolean).WithConversion(new ReverseBooleanValueConverter()); 
bindingSet.Bind(textFieldWithZeroHeight).For(c => c.Active).To(vm => vm.YourBoolean); 

ReverseBooleanValueConverter ressemblerait à quelque chose comme ceci:

public class ReverseBooleanValueConverter: MvxValueConverter<bool, bool> 
{ 
    protected override bool Convert(bool value, Type targetType, object parameter, CultureInfo culture) 
     => !value; 
} 

Quand YourBoolean est vrai, votre UITextField devrait être invisible, et devrait avoir une hauteur de 0f. Quand YourBoolean est faux, il devrait être visible, et devrait avoir un tiers de la hauteur de son conteneur.

+0

A travaillé comme un charme. Merci beaucoup – MRainzo