-1

UIView クラスから拡張して、カスタム ビューを作成しようとしています。私が見つけたすべての例はDrawメソッドをオーバーライドしますが、何も描画する必要はありません.ビューを他のビュー/コントロールで埋める必要があるだけです.コントローラーのViewDidLoadで実行すると、これは正常に機能しますが、カスタムクラスにしようとすると、問題が発生します...私が見つけることができる限り、「複合」ビューを作成するときは、LayoutSubViewsメソッドをオーバーライドする必要があります

ビューがサブビューとして持っているものは無関係です。これは単なる例です:

【登録(「PhotoLabel」)】

public class 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(モノドロイド)でそれを行う方法をよく知っていますが、iOSとMonoTouchにかなり慣れていないので、ここで何が間違っているのかわかりません. したがって、誰かが私に指示したり、これまたは似たような実際の例を提供したりできる場合は、それをいただければ幸いです。

4

1 に答える 1

1

LayoutSubviewsあなたがやっているように新しいものを追加するのではなく、サブビューを配置することを意図しています。UIView.AutoResizingMask一般に、自動サイズ変更 ( ) または自動レイアウト (iOS6 で利用可能)を使用してレイアウトを正しく取得できない場合にのみ、オーバーライドする必要があります。

ViewDidLoadオーバーロードされたビューにサブビューを追加するために使用する必要があるのは正しいです。ビューの最終的なレイアウトは の後にのみ利用可能になることに注意してくださいViewDidLoadBoundsこれは、 andFrameプロパティに依存できないことを意味します。必要に応じて、 で調整しViewWillAppearます。

于 2013-07-26T07:40:06.903 に答える