2016-02-23 5 views
3

Я создал пользовательский вид (новый класс, полученный из 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()); 
    } 
} 

ответ

3

Как ВСЕГДА: это зависит от ваших требований (маленькое приложение/прототип для одной платформы или большего приложения для нескольких платформ). Поэтому ваш вопрос немного основан на мнениях.

Вы хотите назначить текст только один раз? Затем перейдите к Designer или установите свойство Text в свой код. Оставшаяся проблема заключается в том, что вы дублируете свои текстовые значения на каждой поддерживаемой платформе. Вы должны установить его в iOS, Android, UWP, Windows Phone, ... И если вы хотите изменить его, это боль.

Я бы предпочел привязать данные к MvvMCross. Мы используем MvvMCross почти в каждом из наших проектов (начиная с 3 лет), поскольку он обеспечивает строгое разделение представлений, данных и сервисов (с использованием методов mondern, таких как IoC, MvvM, Databinding, Plugins, ViewModel to ViewModel) и множество абстракций platfrom конкретных элементов. Механизм привязки данных позволяет вам изменять просмотренные значения без какой-либо боли. И если вы хотите изменить статическую строку, вы должны сделать это только один раз. Это добавляет, конечно, дополнительный уровень, который может быть трудно понять, если вы новичок в Xamarin, Mobile и/или MvvM, но это того стоит.

+0

Извините за позднюю реакцию и благодарю вас за ответ. Однако мой вопрос касается внутренних элементов пользовательского представления (поскольку это должно быть многоразовым элементом управления/представлением). В основном, если метод «Draw» самого пользовательского представления является правильным местом для установки свойств текста. Со стороны я обязательно буду использовать MvvmCross для привязки к элементу управления. Причина, по которой я спрашиваю, заключается в том, что каким-то образом я чувствую, что метод «Draw» больше подходит для действительно графики (но это действительно просто чувство). –

+0

Итак, просто реализуйте свойства следующим образом: 'public string SubTitle {get {return _subTitle.Text; } set {_subTitle.Text = значение; }} ' –

+0

Будет ли это автоматически обновлять представление при изменении значений? –

Смежные вопросы