自定义iOS UIView类MvvmCross约束 - 绘制(CGRect rect)方法从不调用

时间:2016-01-27 09:52:34

标签: ios uiview xamarin uiscrollview mvvmcross

我有一种情况,我似乎无法解决具体问题所在,我希望得到一点意见。

我有一个非常简单的观点,目前只有一个UIScrollView。在ViewDidLoad方法中,我注册以监听视图模型PropertyChanged事件,如下所示:

public override void ViewDidLoad()
{
    base.ViewDidLoad();
    ViewModel.PropertyChanged += ViewModel_PropertyChanged;
}

private void ViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    if (e.PropertyName == "MyCollection")
    {
        BuildUi();
    }
}

当该事件被触发时,它将启动构建视图,因为数据现在在视图模型中可用。在BuildUi方法中,我有以下代码:

查看代码

private void BuildUi()
{
    _mainScrollView = new UIScrollView(View.Frame)
    {
        ShowsHorizontalScrollIndicator = false,
        AutoresizingMask = UIViewAutoresizing.All
    };

    Add(_mainScrollView);

    View.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();

    View.AddConstraints(
        _mainScrollView.AtLeftOf(View),
        _mainScrollView.AtTopOf(View),
        _mainScrollView.WithSameWidth(View),
        _mainScrollView.WithSameHeight(View));

       foreach(var ctx in ViewModel.MyCollection)
       {
           var contextScoreControl = new ContextScoreView(new CGRect(100,100,100,100), ctx);
           _mainScrollView.Add(contextScoreControl);

           //var btn = ViewHelpers.CreateDefaultButton("test");
           //_mainScrollView.Add(btn);
       }    

    _mainScrollView.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();

    var constraints = _mainScrollView.VerticalStackPanelConstraints(new Margins(20, 10, 20, 10, 5, 5), _mainScrollView.Subviews);
    _mainScrollView.AddConstraints(constraints);
}

控制代码

[Register("MyControl")]
public class MyControl : UIView
{
    private MyViewModel _vm;

    private UILabel _ctxTitle;

    private UITextView _explanationText;

    private UISlider _scoreSlider;

    public MyControl(MyViewModel vm)
    {
        _vm = vm;
        BackgroundColor = UIColor.Cyan;
    }

    public MyControl(IntPtr handle) : base(handle) { }

    public MyControl(CGRect rect, MyViewModel vm)
    {
        _vm = vm;
        BackgroundColor = UIColor.Cyan;
    }

    public MyControl(CGRect rect) : base(rect)
    {
        BackgroundColor = UIColor.Cyan;
    }

    public override void Draw(CGRect rect)
    {
        base.Draw(rect);

        _ctxTitle = ViewHelpers.CreateTitleLabel();
        _ctxTitle.Text = _vm.Text;

        _explanationText = ViewHelpers.CreateAutoExpandingReadOnlyTextView();
        _explanationText.Text = _vm.ScoringHint;

        _scoreSlider = ViewHelpers.CreateDefaultSlider();
        _scoreSlider.Value = _vm.Score;

        AddSubview(_ctxTitle);
        AddSubview(_explanationText);
        AddSubview(_scoreSlider);

        this.AddConstraints(
            _ctxTitle.AtTopOf(this, IosConstants.UIPadding),
            _ctxTitle.AtLeftOf(this, IosConstants.UIPadding),
            _ctxTitle.WithSameWidth(this).Minus(IosConstants.UIPadding * 2),

            _explanationText.Below(_ctxTitle, IosConstants.UIPadding),
            _explanationText.WithSameLeft(_ctxTitle),
            _explanationText.WithSameRight(_ctxTitle),

            _scoreSlider.Below(_explanationText, IosConstants.UIPadding),
            _scoreSlider.WithSameLeft(_explanationText),
            _scoreSlider.WithSameRight(_explanationText),
            _scoreSlider.AtBottomOf(this)

            );
    }
}

我现在看到的问题是从不调用Draw方法,这意味着视图中没有任何内容。

我已经尝试了很多很多可以在控制代码中看到的构造函数的排列。使用CGRect.Empty和代码中的手动生成的CGRect,但无论我尝试什么,我似乎都无法使这段代码工作。

正如您从代码中看到的,如果我为简单的UIButton换出我的自定义控件,一切都按预期工作,因此UIScrollView添加了约束的主视图代码正在工作并自行铺设出乎预期和期望。问题似乎在于控制代码本身或约束本身的层次结构。我无法弄清楚需要做些什么来使这项工作。

在某些情况下,我看到以下错误:

Unable to simultaneously satisfy constraints.

我在应用程序的其他视图中多次使用这种代码“模式”,它适用于那种情况,这就是为什么我对这种情况下发生的事情感到有些困惑。区别在于在这种情况下循环动态数量的控件。

如果不改变视图的当前结构(比如使用UITableView),我怎样才能很好地播放并呈现自定义UIView控件?

0 个答案:

没有答案