2017-04-18 43 views
0

我已經比喻地把我的頭髮拉出來了。我從這篇文章「http://gregshackles.com/fluentlayout-2-5/」中讀到,FluentLayout現在支持約束編輯/刪除,但它似乎不適用於我的結尾。我的場景是當按鈕被點擊時切換UIView中的文本框的可見性。如何修改使用mvvmcross的約束fluentLayout

我試過以下。

A.修改高度約束

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.使用SETACTIVE(假) - 嘗試了這一點

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) 
       ); 

預期結果的絕望

的textfield應該是可見的根據能見度

實際結果

的文本框的高度永遠不會改變,因此始終可見

回答

2

我的猜測是,你height變量在頁面生命週期中設置一次,並沒有得到在那之後改變。實現你需要的東西的方法如下:

首先,綁定你的按鈕來改變你的ViewModel一個boolean的狀態的命令,從而使boolean的價值變化是單擊按鈕時:

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

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

void ReverseMyBool() 
{ 
    YourBoolean = !YourBoolean; 
} 

如果有必要,你ViewModel施工期間設置YourBoolean爲true,具體取決於您是否想頁面加載時被隱藏的領域。現在ViewModel屬性爲您的UITextField應該隱藏是否保持準確的真/假狀態,請將UITextField本身的Hidden綁定到布爾值(您可能需要使用value converter來反轉該值 - 如果Hidden爲true,則視圖是隱形):

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

接下來,創建FluentLayout變量,涉及到這兩種情況下(你的看法是可見的,被隱藏),並應用二者:

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

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

最後,綁定約束S代表ActivebooleanViewModel - 注意,一個將需要一個轉換器被逆轉:

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會是這個樣子:

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

YourBoolean是真實的,你UITextField應該是隱形的,並且應該有0f的高度。當YourBoolean爲假時,它應該是可見的,並且應該具有容器高度的三分之一。

+0

工作就像一個魅力。非常感謝 – MRainzo