如何使UIScrollView高度等于内容高度?

时间:2014-07-26 17:39:37

标签: ios objective-c uiscrollview frame contentsize

我有一个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的大小小于内容大小。 ScrollView frame cannot be set

1 个答案:

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