我有一个 UIScrollView 和可水平滚动的内容。我可以正确设置内容大小等,但我需要在第一个 ScrollView 的正下方放置另一个类似的 ScrollView。因此,我需要使 ScrollView 的高度等于其内容的高度。目前我使用此代码,但它不起作用。我附上了问题截图和代码:
//setting the correct content size of scrollView (self.contentSize is already calculated)
self.imageScrollView.contentSize = self.contentSize;
//creating temporary CGRect
CGRect frame = self.imageScrollView.frame;
//Changing the height and re-assigning new frame to imageScrollView
frame.size.height = self.contentSize.height;
self.imageScrollView.frame = frame;
请看屏幕截图:imageScrollView 就在 NavBar 下方。内容仍然可以滚动,并且 ScrollView 的大小小于内容大小。
最佳答案
您不能使用 frame.size.height = self.contentSize.height;
frame
的高度
改为使用 frame = CGRectMake(x, y, width, height);
例如:
self.imageScrollView.frame = CGRectMake(self.imageScrollView.frame.origin.x, self.imageScrollView.frame.origin.y, self.imageScrollView.frame.size.width, self.contentSize.height);
从外观上看,我怀疑您的 imageScrollView
的内容大小是正确的,但它被您的导航栏隐藏了。在这种情况下,我建议将 imageScrollView
框架的原点设置为导航栏的高度,例如:
self.imageScrollView.frame = CGRectMake(self.imageScrollView.frame.origin.x, self.navigationController.navigationBar.frame.size.height, self.imageScrollView.frame.size.width, self.contentSize.height);
更新 #1:这是一个很好的答案的链接,解释了为什么您不能按照您尝试的方式设置框架:ios frame change one property (eg width)
所以基本上您可以通过更改单个属性来编辑单独的 CGRect
结构,但是如果它是另一个对象的属性,您不能以这种方式更新 CGRect
- - 在本例中是 frame
的属性。
更新 #2:此外,要更改界面中元素的位置,请将代码放在 viewDidLayoutSubviews
中,而不是 viewDidLoad
中。
更新 #3:要让 viewDidLayoutSubviews
中的代码只处理一次,请将其包含在条件语句中,例如:
bool subviewsLaidout;
- (void)viewDidLoad {
subviewsLaidout = NO;
}
- (void)viewDidLayoutSubviews {
if (!subviewsLaidout) {
self.imageScrollView.frame = CGRectMake(self.imageScrollView.frame.origin.x, self.navigationController.navigationBar.frame.size.height, self.imageScrollView.frame.size.width, self.contentSize.height);
subviewsLaidout = YES;
}
}
关于ios - 如何使 UIScrollView 高度等于内容高度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24973754/