2013-07-26 2 views
-1

Я пытаюсь создать пользовательский вид, расширяя его из класса UIView. Все примеры, которые я нахожу, переопределяют метод Draw, но мне не нужно рисовать что-то, что мне нужно, чтобы заполнить представление другими представлениями/элементами управления, когда это делается в ViewDidLoad в контроллере, это прекрасно работает, но как только я попробуйте сделать это Custom-класс, все пойдет не так ... Насколько я мог найти, при создании «сложных» видов нужно переопределить метод LayoutSubViewsMonotouch: Как сделать многоразовый составной вид

Что такое представление как подпункт, это не имеет значения. просто пример:

[Register ("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); 
    } 

Guess я с видом что-то, я очень хорошо знаю, как сделать это в Android (monodroid), но поскольку я довольно новичок в iOS и MonoTouch, я понятия не имею, что я делаю неправильно здесь. Поэтому, если кто-нибудь может направить меня или предоставить мне рабочий пример этого или что-то подобное, это будет оценено.

ответ

1

LayoutSubviews предназначен для размещения ваших подзонов, а не для добавления новых, как вы делаете. В общем случае вам нужно будет переопределить его, если вы не можете правильно выбрать макет, используя автоматическое изменение размера (UIView.AutoResizingMask) или автомат (доступный с iOS6).

Вы правы, что вы должны использовать ViewDidLoad, чтобы добавить subviews в ваш перегруженный вид. Имейте в виду, что окончательный макет вашего представления будет доступен только после ViewDidLoad. Это означает, что вы не можете полагаться на свойство Bounds и Frame. При необходимости выполните настройки в ViewWillAppear.

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