Monotouch:如何制作可重复使用的复合视图

时间:2013-07-26 06:42:17

标签: c# ios uiview xamarin.ios custom-component

我一直在尝试通过从UIView类扩展来创建自定义视图。我找到的所有示例都覆盖了Draw方法,但是我不需要绘制任何我需要用其他视图/控件填充视图的东西,当在控制器中的ViewDidLoad中完成时,这很好用,但是一旦我试着把它变成一个Custom类,出问题...... 据我所知,在创建“复合”视图时,必须覆盖LayoutSubViews方法

视图与子视图的含义无关,这只是一个例子:

  

[注册(“PhotoLabel”)]

     

公共类PhotoLabel:UIView       {

  public PhotoLabel () : base () {}
  public PhotoLabel (IntPtr p) : base (p) {}
  public PhotoLabel (RectangleF rect) : base (rect) {}

  public override void LayoutSubviews ()
    {
        base.LayoutSubviews ();
        if (Image != null) {
            AddSubviews (ImageView, Label);
        } else {
            AddSubview (Label);
        }
    }


  public UIImage Image { 
        get {
            return ImageView.Image;
        } 
        set {
            ImageView.Image = value;
            SetNeedsDisplay ();
        } 
    }

  UIImageView ImageView { 
        get {
            var iFrame = new RectangleF (0, 0, this.Frame.Height, this.Frame.Height);
            return new UIImageView () {
                Frame = iFrame,
                ContentMode = UIViewContentMode.Center,
                Image = this.Image.Scale (new SizeF (iFrame.Width, iFrame.Height))
            };
        } 
    }

  public string Text {
        get {
            return Label.Text;
        }
        set {
            Label.Text = value;
            SetNeedsDisplay ();
        }
    }

  UILabel Label { 
        get {
            var x = Image != null ? this.Frame.Height : 0;
            var width = Image != null ? this.Frame.Width - this.Frame.Height : this.Frame.Width;
            var lFrame = new RectangleF (x, 0, width, this.Frame.Height);
            return new UILabel () {
                Frame = lFrame,
                ContentMode = UIViewContentMode.Center,
                TextAlignment = UITextAlignment.Left,
                Text = this.Text,
                Font = UIFont.BoldSystemFontOfSize (17),
                BackgroundColor = UIColor.Clear
            };
        } 
    }
}

我试图这样使用它:

public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();
        var pLabel = new PhotoLabel () {
            Frame = new RectangleF (5,5, 100, 60),
            Image = UIImage.FromFile ("photo.png"),
            Text = "some text"
        };
        this.View.AddSubview (hCell);
    }

猜猜我忽略了什么,我非常清楚如何在Android(monodroid)中做到这一点,但由于我对iOS和MonoTouch很新,我不知道我在这里做错了什么。因此,如果有人可以指导我或提供类似的这个或类似的工作示例,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

LayoutSubviews用于安排您的子视图,而不是像您一样添加新视图。 一般情况下,如果使用自动调整大小(UIView.AutoResizingMask)或自动布局(iOS6可用)无法正确布局,则只需覆盖它。

您应该使用ViewDidLoad将子视图添加到重载视图中。请注意,视图的最终布局仅在ViewDidLoad之后才可用。这意味着,您不能依赖BoundsFrame属性。如有必要,请在ViewWillAppear进行调整。