0

我有一个 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 框架

4

1 回答 1

2

您不能frame使用frame.size.height = self.contentSize.height;

而是使用frame = CGRectMake(x, y, width, height);Ex:

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以这种方式更新它——在这种情况下是 a 的属性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;
    }
}
于 2014-07-26T18:05:25.800 回答