我有一个UIScrollView和可水平滚动的内容。我可以正确设置内容大小等,但我需要在第一个下面放置另一个类似的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的大小小于内容大小。
答案 0 :(得分:2)
您无法使用frame
frame.size.height = self.contentSize.height;
的身高
而是使用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;
}
}