如何正确绑定NSLayoutConstraint的常量?

时间:2014-12-23 16:54:18

标签: ios xamarin.ios xamarin mvvmcross

我正在使用Xamarin和MVVMCross开发应用程序,而且我在创建绑定NSLayoutConstraints常量方面遇到了问题。

我有一个Subview的视图应该" disapear"如果某个List<>没有元素,下面的内容应该向上移动,而不是让它的空间为空。

为此,我在此视图中添加了一个NSLayoutConstraint,以便能够以编程方式修改它的高度,并将其与以下代码行绑定:

var set = this.CreateBindingSet<ActivityView, ActivityViewModel> ();
set.Bind (ConstraintHeightPictures).To (vm => vm.Activity.ImageList.Count).For (cons => cons.Constant).WithConversion ("CountToConstraintHeight", Constants.HeightActivityImages);
set.Apply ();

CountToConstraintHeightConverter非常简单,它只是检查值是否等于0以返回0或其他默认高度值(Constants.HeightActivityImages)。

代码没有给出执行错误并通过转换器,但是当我运行应用程序时,View仍然存在,为空。

另一方面,如果我在ViewWillLayoutSubviews中运行以下代码行,它可以很好地工作,但它没有绑定。

ConstraintHeightPictures.Constant = ViewModel.Activity.ImageList.Count > 0 ? Constants.HeightActivityImages : 0.0f;

有什么想法吗?

非常感谢提前!

霍尔迪阿

1 个答案:

答案 0 :(得分:3)

我认为问题是iOS需要您在设置常量后调用LayoutIfNeeded(或类似)。

e.g。要为约束常量更改设置动画,请参阅Are NSLayoutConstraints animatable?

对于绑定,您可以使用View上的属性来执行此操作,例如:

public float PicHeight
{
     get { return ConstraintHeightPictures.Constant; }
     set { 
         ConstraintHeightPictures.Constant = value;
         _pictureView.SetNeedsUpdateConstraints();
         UIView.Animate(0.25f, () => {
             _pictureView.LayoutIfNeeded();
         }
     }
}

然后可以绑定为:

set.Bind (this).To (vm => vm.Activity.ImageList.Count).For (v => v.PicHeight).WithConversion ("CountToConstraintHeight", Constants.HeightActivityImages);

我认为这应该有用......(如果你不想要动画,那么应该很容易将其去掉)

或者......您也可以构建一个知道如何进行此更改的自定义绑定(尽管由于它需要访问子视图和约束这一事实可能会有点复杂)