计算scrollview的内容大小

时间:2010-06-15 15:08:20

标签: iphone uiscrollview

我有一个scrollview作为tableview单元格的详细视图。我正在通过界面构建​​器创建标签,按钮等详细视图上有多个视图。我通过界面构建​​器创建的是静态的。我把所有东西都放在480的高度上。

我的详细视图上的标签是动态文本,可以扩展到任何长度。问题是我需要设置我需要其高度的scrollview的内容大小。

如果内容是动态的,我该如何设置scrollview的高度?

7 个答案:

答案 0 :(得分:20)

您可以尝试使用scrollview'ers ContentSize。它对我有用,并且我使用动态内容控制时遇到了同样的问题。

    // Calculate scroll view size
float sizeOfContent = 0;
int i;
for (i = 0; i < [myScrollView.subviews count]; i++) {
    UIView *view =[myScrollView.subviews objectAtIndex:i];
    sizeOfContent += view.frame.size.height;
}

// Set content size for scroll view
myScrollView.contentSize = CGSizeMake(myScrollView.frame.size.width, sizeOfContent);

我在控件中名为viewWillAppear的方法中为保存scrollview的视图执行此操作。这是我在super上调用viewDidLoad之前做的最后一件事。

希望它能解决你的问题。

//汉纳斯

答案 1 :(得分:8)

纠正较短的例子:

float hgt=0; for (UIView *view in scrollView1.subviews) hgt+=view.frame.size.height;

[scrollView1 setContentSize:CGSizeMake(scrollView1.frame.size.width,hgt)];

请注意,这仅限于高度,例如:如果有两个子视图并排,他们的高度都会被添加,使得总和大于它应该是。此外,如果子视图之间存在垂直间隙,则总和将小于应有的值。错误的高度混淆scrollRectToVisible,给出随机滚动位置:)

此循环正在运行并经过测试:

float thisy,maxy=0;for (UIView *view in scrollView1.subviews) {
    thisy=view.frame.origin.y+view.frame.size.height; maxy=(thisy>maxy) ? thisy : maxy;
}

答案 2 :(得分:1)

更简单的方法是将布局嵌套在视图中,然后将该视图放在滚动视图中。假设您使用标签,其工作原理如下:

UIScrollView *scrollview = (UIScrollView *)[self.view viewWithTag:1];
UIView *longView = (UIView *)[self.view viewWithTag:2];
scrollview.contentSize = CGSizeMake(scrollView.frame.size.width, longView.frame.size.height);

这样,longView知道它的高度,并且scrollview的内容只是设置为匹配。

答案 3 :(得分:1)

这取决于您要动态添加的内容类型。因此,假设您有一个要显示的大文本数据,然后使用UITextView,因为它是UIScrollView的子类,您可以在分配文本内容时获取TextView的setContentSize。基于此,您可以设置UIScrollView的总大小。

float yPoint = 0.0f; 
UIScrollView *myScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0f, yPoint, 320.0f, 400.0f)];

UITextView *calculatorTextView = [[UITextView alloc] init]; calculatorTextView.text = @"My looong content text ..... this has a dynamic content"; `


[calculatorTextView sizeToFit];


yPoint = yPoint + calculatorTextView.contentSize.height; // Bingo, we have the new yPoint now to start the next component.

//现在您知道文本的高度以及文本的结束位置。因此,您可以创建Label或其他TextView并在那里显示您的文本。您可以将这些组件作为子视图添加到滚动视图中。

UITextView *myDisplayContent = [[UITextView alloc] initWithFrame:CGRectMake(0.0f, yPoint, 300.f, calculatorTextView.contentSize.height)];

myDisplayContent.text = @"My lengthy text ....";
[myScrollView addSubview:myDisplayContent];

//最后,将'myScrollView'的内容大小设置为显示区域的总长度。

[myScrollView setContentSize:yPoint + heightOfLastComponent];

这适合我。

答案 4 :(得分:0)

我想在滚动视图的情况下没有自动,并且应该至少为屏幕上的静态视图计算内容大小,并且应该在移动时计算动态的内容大小。

答案 5 :(得分:0)

scrollView.contentSize = [scrollView sizeThatFits:scrollView.frame.size]

我相信也会有用

答案 6 :(得分:0)

I had the same situation, but then I wrote a new version in Swift 4 mirroring the better answer in Objective-C by Hannes Larsson:

import UIKit

extension UIScrollView {
    func fitSizeOfContent() {
        let sumHeight = self.subviews.map({$0.frame.size.height}).reduce(0, {x, y in x + y})
        self.contentSize = CGSize(width: self.frame.width, height: sumHeight)
    }
}