0

UIScrollView内で動的に変更されるUILabel(contentLblという名前)があります。その上には、タイトルであり、動的コンテンツを含まない別のUILabel(contentTitleLblという名前)があります。正常にスクロールするには、少なくともUIScrollViewのContentSizeをコンテンツビューのContentSizeに設定する必要があることを知っています。フレームを設定する必要があることもわかりました。両方試してみましたが、まだスクロールしません。

私の例のコードcontentViewには、contentLblとcontentTitleLblの両方が含まれています。scrollViewは、私が現在使用しようとしているUIScrollViewへの参照です。

これが私の現在のコードです:

public override void ViewDidLoad ()
{
    base.ViewDidLoad ();
    //contentLbl is to have dynamic text, and currently stores a large lorem ipsum paragraph
    //contentTitleLbl is the title and is not dynamic
    this.contentLbl.SizeToFit();
    this.scrollView.ContentSize = new SizeF(this.contentView.Frame.Width, this.contentLbl.Frame.Size.Height + this.contentTitleLbl.Frame.Size.Height);
    this.scrollView.Frame = new RectangleF(this.scrollView.Frame.X, this.scrollView.Frame.Y, this.scrollView.ContentSize.Width, this.scrollView.ContentSize.Height);
    this.scrollView.AddSubview(this.contentView);
}

どんな助けでも大歓迎です!

4

2 に答える 2

3

簡単な質問:タイトルをテキストと一緒にスクロールするつもりですか?このソリューションでは、これが私の解釈であるため、これを実行しました。必要に応じて、タイトルがスクロールしないように調整します。XCodeでこの階層を作成して、サンプルを再作成しました

  • UIView(ビューコントローラのメインビュー)
    • UIView(contentView)
      • UILabel(contentTitleLbl)
        • フレーム=(20,15,160,21)
      • UILabel(contentLbl)
        • 行=100
        • フレーム=(20,43,160,190)
        • Text = "Lorem ipsum ..."(長い段落)
    • UIScrollView(scrollView)
      • フレーム=(20,20,140,​​140)

すべてのコンポーネントの寸法を確認できるように、すべてのアイテムの背景色を異なる値に設定しました。

まず、ラベルの自動サイズ変更がすべてオフになっていることを確認する必要がありました。これは、XCodeで、またはプログラムで行うことができます。

contentLbl.AutoresizingMask = UIViewAutoresizing.None;
contentTitleLbl.AutoresizingMask = UIViewAutoresizing.None;

Via XCodeのcontentView内部に配置したいのですが、メインの下に兄弟として配置されているようです。だから私たちはそれを中に置くために親を再設定しますscrollViewViewcontentViewscrollView

scrollView.AddSubview( contentView );

次に、タイトルをと同じ幅scrollViewにし、原点に配置し、XCodeで設計された高さを残します

var f = contentTitleLbl.Frame;
f.X = 0;
f.Y = 0;
f.Width = scrollView.Frame.Width;
contentTitleLbl.Frame = f;

UILabel次に、最初の大きな問題は、コンテンツに動的に合わせてサイズを変更することです。SizeToFitラベルのサイズを1行のテキストに変更します(または、少なくとも私にとってはそうしました)。本当に必要なのは、MonoTouchにUIView.StringSizeとして表示されるものNSString.sizeWithFontです。これらの一部は1行のテキストのサイズを返すため、注意してください。ここでは、幅をスクロールビューの幅に制限しましたが、を使用して高さを制限しないようにしました。float.MaxValue

SizeF sz = this.View.StringSize(
    contentLbl.Text,
    contentLbl.Font,
    new SizeF( scrollView.Frame.Width, float.MaxValue),
    UILineBreakMode.WordWrap );

次に、ラベルのサイズを変更して、タイトルのすぐ下に配置します。

f = contentLbl.Frame;
f.X = 0;
f.Y = contentTitleLbl.Frame.Bottom; // nudge the contentLbl right up against the title
f.Width = sz.Width;    // size matches the measured values from above
f.Height = sz.Height;
contentLbl.Frame = f;

次に、のサイズを調整してcontentView、タイトルとコンテンツを保持します。このビューは、スクロールビューの原点に配置されます。サイズは上記のコードによって動的に決定されます。コンテンツ全体がレンダリングされたことがわかるように、下部に小さなマージンを追加しました

f = contentView.Frame;
f.X = 0;
f.Y = 0;
f.Width = scrollView.Frame.Width;
f.Height = contentLbl.Frame.Bottom + 20;
contentView.Frame = f;

次にContentSize、スクロールビューのをcontentViewのサイズに設定します。サイズが スクロールビューのサイズよりも大きい場合( Lorem Ipsumテキストの場合のように)、スクロールが表示されます。

scrollView.ContentSize = contentView.Frame.Size;

乾杯。

[編集:「幅」と「高さ」のタイプミスを修正]

[編集:最も単純なスクロールビュー]

これが私が思いついた最も単純なスクロールビューです。赤い領域を上下にドラッグすると、スクロールバーが表示されます。一番下に到達すると、スクロールビューの緑色の背景が表示されます。

var v =  new UIView( new RectangleF(0,0,200,1000));
v.BackgroundColor = UIColor.Red;

var sv = new UIScrollView( new RectangleF(20,20,200,300));
sv.BackgroundColor = UIColor.Green;
sv.ContentSize = v.Frame.Size;

View.AddSubview(sv);
sv.AddSubview(v);

[編集:さらにシンプルなスクロールビュー] XCodeでスクロールビューを作成し、背景色とコンテンツサイズをスクロールビューのサイズよりも大きく設定するだけです。青いスクロールビューをドラッグすると、スクロールバーが表示されます。

designerScrollView.BackgroundColor = UIColor.Blue;
designerScrollView.ContentSize = new SizeF(1000,1000);
于 2012-09-18T23:23:47.813 に答える
0

このメソッド拡張を追加するだけです。サブビューの追加が完了したら、それを呼び出します。このメソッドは、新しいコンテンツの高さを計算し、スクロールビューに割り当てます。

public static void RecalculateContentSize (this UIScrollView scrollView)
        {
            float sizeOfContent = 0;
            float height = 0;
            for (int i = 0; i < scrollView.Subviews.Length; i++) {
                UIView view = scrollView.Subviews [i];
                height = view.Frame.Location.Y + view.Frame.Size.Height;
                if (height > sizeOfContent)
                    sizeOfContent = height;
            }

            // Set content size for scroll view
            scrollView.ContentSize = new System.Drawing.SizeF (scrollView.Frame.Size.Width, sizeOfContent);
        }
于 2013-05-10T18:19:46.410 に答える