Я создал пользовательский вид (новый класс, полученный из UIView). Это представление предназначено для использования в качестве заголовка в моем приложении iOS и в основном содержит две метки, называемые «Title» и «SubTitle». Я создал два соответствующих строковых свойства, которые можно использовать для установки текста меток «Заголовок» и «Субтитры».Xamarin iOS пользовательский вид
Мой вопрос: какое лучшее место для назначения строковых значений, предоставляемых свойствам (скажем, используя привязку с MvvmCross или просто дизайнером iOS) к свойству .text ярлыков?
Я знаю, что он будет работать, если я переопределяю метод Draw(CGRect rect)
и присваиваю здесь значения (и вызывается метод SetNeedsDisplay()
при изменении значений свойств). Однако вызов Draw(CGRect rect)
просто звучит неправильно для меня. Любая помощь будет оценена по достоинству.
В настоящее время у меня есть следующий код:
[Register("MenuHeaderView"), DesignTimeVisible(true)]
public class MenuHeaderView : UIView
{
private const int _margin = 5;
private UILabel _title;
private UILabel _subTitle;
public MenuHeaderView()
{
Initialize();
}
public MenuHeaderView(CGRect frame)
: base(frame)
{
Initialize();
}
public MenuHeaderView(IntPtr p)
: base(p)
{
Initialize();
}
[Export("Title"), Browsable(true)]
public string Title { get; set; }
[Export("SubTitle"), Browsable(true)]
public string SubTitle { get; set; }
private void Initialize()
{
AutoresizingMask = UIViewAutoresizing.FlexibleDimensions;
// Create 'Title' label
_title = new UILabel()
{
BackgroundColor = UIColor.Clear,
Font = UIFont.BoldSystemFontOfSize(UIFont.SystemFontSize),
TextAlignment = UITextAlignment.Left,
TextColor = UIColor.White,
Text = "Verbeterapp",
TranslatesAutoresizingMaskIntoConstraints = false
};
// Create 'SubTitle' label
_subTitle = new UILabel()
{
BackgroundColor = UIColor.Clear,
Font = UIFont.SystemFontOfSize(UIFont.SystemFontSize),
TextAlignment = UITextAlignment.Left,
TextColor = UIColor.White,
Text = "JCI",
TranslatesAutoresizingMaskIntoConstraints = false
};
this.AddSubviews(new UIView[] { _title, _subTitle });
SetNeedsUpdateConstraints();
}
public override void UpdateConstraints()
{
if (NeedsUpdateConstraints())
SetupContraints();
base.UpdateConstraints();
}
private void SetupContraints()
{
var constraints = new List<NSLayoutConstraint>();
var viewMetrics = new Object[] {
"titleLabel", _title,
"subTitleLabel", _subTitle,
"margin", _margin
};
constraints.AddRange(
NSLayoutConstraint.FromVisualFormat(
"V:[titleLabel]-margin-[subTitleLabel]",
NSLayoutFormatOptions.AlignAllLeading,
viewMetrics
)
);
constraints.Add(
NSLayoutConstraint.Create (
_title,
NSLayoutAttribute.Left,
NSLayoutRelation.Equal,
this,
NSLayoutAttribute.Left,
1,
8
)
);
constraints.Add (
NSLayoutConstraint.Create(
_title,
NSLayoutAttribute.CenterY,
NSLayoutRelation.Equal,
this,
NSLayoutAttribute.CenterY,
1,
-_subTitle.Frame.Height
)
);
AddConstraints(constraints.ToArray());
}
}
Извините за позднюю реакцию и благодарю вас за ответ. Однако мой вопрос касается внутренних элементов пользовательского представления (поскольку это должно быть многоразовым элементом управления/представлением). В основном, если метод «Draw» самого пользовательского представления является правильным местом для установки свойств текста. Со стороны я обязательно буду использовать MvvmCross для привязки к элементу управления. Причина, по которой я спрашиваю, заключается в том, что каким-то образом я чувствую, что метод «Draw» больше подходит для действительно графики (но это действительно просто чувство). –
Итак, просто реализуйте свойства следующим образом: 'public string SubTitle {get {return _subTitle.Text; } set {_subTitle.Text = значение; }} ' –
Будет ли это автоматически обновлять представление при изменении значений? –