【问题标题】:How to make UIScrollView height equal to content height?如何使 UIScrollView 高度等于内容高度?
【发布时间】:2014-07-26 17:39:37
【问题描述】:

我有一个 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 本身呢,你确定scrollView.frame.origin.y 设置正确吗?
  • 我像往常一样将它设置在故事板中,左上角在 0,0 位置,所以在 NavBar,但在所有其他情况下都可以。
  • 看起来 imageScrollView 实际上是正确的高度,但只是隐藏在导航栏下方。如果将其向下移动导航栏的高度会发生什么?那你能看到整个滚动视图吗?
  • 即使我做到了:frame.origin.y = 300.0f;,也无济于事。它什么都不做,也不会改变 ScrollView 的位置
  • 那是因为你不能那样设置框架。你需要这样设置:frame = CGRectMake(x,y,width,height);

标签: ios objective-c uiscrollview frame contentsize


【解决方案1】:

您不能使用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 是另一个对象的属性,则不能以这种方式更新它 - 在这种情况下是 @987654331 的属性@。

更新#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;
    }
}

【讨论】:

  • 使用此代码:self.imageScrollView.frame = CGRectMake(self.imageScrollView.frame.origin.x, self.navigationController.navigationBar.frame.size.height, self.imageScrollView.frame.size.width, self.contentSize.height);,不会改变任何东西。看不出这样做有什么意义,因为我首先将框架转换为变量,然后更改变量,然后才将 var 分配给框架,如您的示例所示。我这样做只是为了让它更容易。
  • 你能解释一下,为什么?我记得,我已经完成了这种代码并且它工作了
  • @RichardTopchiy 我刚刚发布了一个帖子的链接,其中的解释非常好
  • 非常感谢!我想我也检查了 AutoLayout 解决方案,似乎它不起作用
  • 你是把这段代码放在viewDidLoad里吗?如果是这样,请将其放在 viewDidLayoutSubviews 中。
猜你喜欢
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多