计算滚动视图的内容大小

7
我正在将一个滚动视图作为表格视图单元的详细视图。详细视图上有多个视图,如标签、按钮等,这些都是通过接口构建器创建的。我通过接口构建器创建的内容是静态的。我把所有内容放在高度为480的视图上。
我的详细视图上有一个标签,其文本是动态的,可能会延伸到任意长度。问题是我需要设置滚动视图的内容大小,而我需要知道它的高度。
如果内容是动态的,我该如何设置滚动视图的高度呢?
7个回答

21
你可以尝试使用ScrollView的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方法中执行此操作。这是我在调用超级视图的viewDidLoad之前要做的最后一件事。

希望它能解决你的问题。

// Hannes


您释放您迭代的视图,这将它们从滚动视图中移除。无法在评论中正确粘贴代码,已添加为答案。 - Henrik Erlandsson

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;
}

谢谢 Henrik,这真的很有帮助!由于我不能接受两个答案,所以我会点赞你的.. :) - neha

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.

// 现在你知道了文本的高度和结束位置。因此,你可以创建一个标签或另一个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];

这对我有效。


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);

这样,长视图就知道自己有多高了,滚动视图的内容也会相应地进行设置。


0

我曾经遇到过同样的情况,但是后来我用Swift 4写了一个新版本,模仿了Objective-C中更好的答案,这个答案是由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)
    }
}

0

我猜在scrollview中没有自动计算,而且contentsize应该至少为屏幕上的静态视图计算,对于动态视图则应该实时计算。


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

我相信这也可以工作


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接