我有一种情况,我似乎无法解决具体问题所在,我希望得到一点意见。
我有一个非常简单的观点,目前只有一个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
控件?