Xamarin iOS自定义视图

时间:2016-02-23 10:37:14

标签: ios uiview xamarin

我创建了一个自定义视图(从UIView派生的新类)。此视图用作我的iOS应用程序中的标题,基本上包含两个名为“Title”和“SubTitle”的标签。我创建了两个匹配的字符串属性,可用于设置“Title”和“SubTitle”标签的文本。

我的问题是,将提供给属性的字符串值(比如使用与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());
    }
}

2 个答案:

答案 0 :(得分:3)

总之:它取决于您的要求(一个平台的小应用程序/原型或多个平台的更大应用程序)。因此,您的问题有点基于意见。

您想要一次分配文字吗?然后转到Designer或在代码中设置Text属性。剩下的问题是,您使用每个支持的平台复制文本值。你必须在iOS,Android,UWP,Windows Phone中设置它......如果你想改变它,那就太痛苦了。

我更喜欢与MvvMCross进行数据绑定。我们几乎在每个项目中使用MvvMCross(从3年开始),因为它提供了严格的视图,数据和服务分离(使用IoC,MvvM,数据绑定,插件,ViewModel到ViewModel导航等现代方法)和很多抽象特定元素。数据绑定机制允许您无任何痛苦地更改查看的值。如果要更改静态字符串,则只需执行一次。如果你是Xamarin,Mobile和/或MvvM的新手,它当然会增加一个可能难以理解的额外水平,但它是完全值得的。

答案 1 :(得分:0)

对于Xamarin.iOS,您可以尝试类似this.