我有一个scrollview作为tableview单元格的详细视图。我正在通过界面构建器创建标签,按钮等详细视图上有多个视图。我通过界面构建器创建的是静态的。我把所有东西都放在480的高度上。
我的详细视图上的标签是动态文本,可以扩展到任何长度。问题是我需要设置我需要其高度的scrollview的内容大小。
如果内容是动态的,我该如何设置scrollview的高度?
答案 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)
}
}