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

标签 ios objective-c uiscrollview frame contentsize

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

最佳答案

您不能使用 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/

相关文章:

objective-c - 如何在 ios 中不收到 "instance method not found"警告的情况下调用委托(delegate)函数?

ios - Cocos2D + Box2D 编辑器?

ios - avplayer播放视频时没有声音

objective-c - 在 iOS SDK 中获取周数

ios - UIPageViewController 内的 UIScrollView 重叠。错误与否?

ios - 如何根据 UITableView 高度动态设置 UIScrollView 高度?

ios - 使用 Firebase 3 和 Swift 注销用户仍然显示 `currentUser`

ios - UITableView:显示最后一个单元格分隔符的正确方法

iphone - 递增属性 int (self.int++)

ios - 启用 UIScrollView 时 subview 不会出现