我一直在尝试通过从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很新,我不知道我在这里做错了什么。因此,如果有人可以指导我或提供类似的这个或类似的工作示例,我们将不胜感激。
答案 0 :(得分:1)
LayoutSubviews
用于安排您的子视图,而不是像您一样添加新视图。
一般情况下,如果使用自动调整大小(UIView.AutoResizingMask
)或自动布局(iOS6可用)无法正确布局,则只需覆盖它。
您应该使用ViewDidLoad
将子视图添加到重载视图中。请注意,视图的最终布局仅在ViewDidLoad
之后才可用。这意味着,您不能依赖Bounds
和Frame
属性。如有必要,请在ViewWillAppear
进行调整。