UIScrollView的contentInset不起作用

7
我遇到了一个问题,即contentInset在UIScrollView与键盘弹出一起使用时无法正常工作。它“有点”可用:由于某种原因,我需要较大的数字(也许超过视图的高度?)才能使其起作用,尽管所有关于contentInset的文档都显示小数字,如40.0(例如,对于一个栏),或者键盘高度。

我通过以下步骤在全新应用程序中复制了该问题:

  1. 使用Xcode新项目创建新的单视图应用程序
  2. 在故事板中,拖动一个占满整个视图大小的滚动视图
  3. 在故事板中,在屏幕底部(滚动视图内)拖入一个按钮
  4. 将滚动视图链接到ViewController中的一个新属性
  5. 将按钮链接到ViewController中的一个方法
  6. 使按钮的按下方法设置contentInset

这是ViewController的代码:

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@end

@implementation ViewController
- (IBAction)button:(id)sender {
    self.scrollView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 600, 0.0);
}
@end

我缺失了什么/为什么我需要大量的数字?
4个回答

18

检查self.scrollView.contentSize是否设置正确。如果contentSize.height为0(按照您的步骤将是这种情况),则需要大量插入。

尝试在按钮方法中添加[self.scrollView setContentSize: CGSizeMake(320, 568)];,然后您会注意到您的插入现在会按预期工作。


1
谢谢。我之前看过那个属性,但我没有意识到在设置contentInset后它会被重置为{0,0}。我必须在插图之后设置contentSize - Dan2552
@Matt 我不太常用 UIScrollView,但这很有趣。为什么在设置 contentInsetcontentSize 会被重置?这是否意味着逻辑上的步骤应该是先设置 contentInset 然后再设置 contentSize - Unheilig
@Unheilig 设置 contentInset 不应该重置 *contentSize*。 - Matt
@Matt 好的,没问题。我的问题基于上面第一个评论中 OP 的说法。 - Unheilig
@Unheilig 我认为在这种情况下发生的是将UIButton放入UIScrollView中会导致Autolayout将contentSize设置为0。 Autolayout似乎优先于在viewDidLoad中设置contentSize。 - Matt
@Matt 感谢回复。+1。 - Unheilig

4

Matt是对的,这与self.scrollView.contentSize有关。我正在使用自动布局,对我来说缺失的一环是显式设置scrollView的contentSize属性与我的contentView的框架大小相同(contentView是我的scrollView内包含所有其他视图的视图)。我的contentView被编码为基于我放置的元素的大小。它们在contentView上“向外推”,因此动态驱动contentView的大小。在viewDidLayoutSubviews的“最后一步”中,我将动态大小链接到scrollView.contentSize。现在事情按预期工作了。

// Auto Layout Solution
- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.scrollView.contentSize = self.contentView.frame.size;
}

1
在我的情况下,我只是忘记在Interface Builder中连接ScrollView...

1
当我使用约束自动布局时,遇到了与您相同的问题。直到我在keyboardWillShow的末尾添加了以下行代码,滚动视图才能够随着contentInset移动。正如上面所述,我怀疑自动布局正在重置contentSize。
scrollView.contentSize = CGSize(width: scrollView.frame.width, height: scrollView.frame.height)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接