0

我有一个 UILabel(名为 contentLbl),它会在 UIScrollView 中动态变化。上面是另一个 UILabel(名为 contentTitleLbl),它是一个标题,不包含动态内容。要成功滚动,我知道我必须至少将 UIScrollView 的 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(视图控制器的主视图)
    • 界面视图(内容视图)
      • UILabel (contentTitleLbl)
        • 帧 = (20,15,160,21)
      • UILabel (contentLbl)
        • 行数 = 100
        • 帧 = (20,43,160,190)
        • Text = "Lorem ipsum..."(长段)
    • UIScrollView(滚动视图)
      • 帧 = (20,20,140,​​140)

我将所有项目的背景颜色设置为不同的值,以便我可以看到所有组件的尺寸。

首先,我需要确保标签的所有自动调整大小都已关闭。您可以在 XCode 中或以编程方式执行此操作:

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

我更喜欢将via XCode 放在contentView里面scrollView,但看起来你将它们作为兄弟姐妹放在 main 下View。所以我们将contentView其重新放置在scrollView

scrollView.AddSubview( contentView );

然后使标题与 的宽度相同scrollView,将其定位在原点并保持 XCode 中设计的高度

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

然后是第一个主要问题:调整 a 的大小UILabel以动态适应您的内容。SizeToFit将标签调整为单行文本(或至少为我做了)。您真正想要的是在 MonoTouchNSString.sizeWithFont显示为 UIView.StringSize。请小心,因为其中一些会返回单行文本的大小。在这里,我将宽度限制为滚动视图的宽度,但使用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 回答