当contentSize更改时,UIScrollView会调整contentOffset

Ber*_*rik 37 iphone uiscrollview ios contentsize

我正在调整一个详细视图控制器的状态,就在它按下之前navigationController:

[self.detailViewController detailsForObject:someObject];
[self.navigationController pushViewController:self.detailViewController
                                     animated:YES];
Run Code Online (Sandbox Code Playgroud)

DetailViewController一个scrollView驻留.我根据传递的对象调整了哪些内容:

- (void)detailsForObject:(id)someObject {
    // set some textView's content here
    self.contentView.frame = <rect with new calculated size>;

    self.scrollView.contentSize = self.contentView.frame.size;
    self.scrollView.contentOffset = CGPointZero;
}
Run Code Online (Sandbox Code Playgroud)

现在,这一切都有效,但scrollView会contentOffset在navigationController的滑入式动画中调整它.在contentOffset将被设置为最后contentSize和新计算之间的差异.这意味着第二次打开detailsView时,详细信息将滚动到某个不需要的位置.即使我设置contentOffsetCGPointZero明确.

我发现,重新contentOffset- viewWillAppear没有任何效果.我能想到的最好的方法是重置contentOffset viewDidAppear,导致内容明显上下移动:

- (void)viewDidAppear:(BOOL)animated {
    self.scrollView.contentOffset = CGPointZero;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法防止UIScrollViewcontentOffsetcontentSize改变时调整它?

Kar*_*nne 58

使用a 推送UIViewController包含a 时发生.UIScrollViewUINavigationController

IOS 7

解决方案1(代码)

设置@property(nonatomic, assign) BOOL automaticallyAdjustsScrollViewInsetsNO.

解决方案2(故事板)

取消选中 Adjust Scroll View Insets

调整滚动视图插图

iOS 6

解决方案(代码)

设置UIScrollView的财产contentOffsetcontentInsetviewWillLayoutSubviews.示例代码:

- (void)viewWillLayoutSubviews{
  [super viewWillLayoutSubviews];
  self.scrollView.contentOffset = CGPointZero;
  self.scrollView.contentInset = UIEdgeInsetsZero;
}
Run Code Online (Sandbox Code Playgroud)

  • 出色的答案.感谢您发布iOS 7中的差异,甚至包括要澄清的图像.超! (3认同)

Ber*_*rik 15

尽管我找到了解决方案,但问题的原因仍不清楚.通过在调整内容大小和偏移量之前重置它们,UIScrollView将不会设置动画:

- (void)detailsForObject:(id)someObject {
    // These 2 lines solve the issue:
    self.scrollView.contentSize = CGSizeZero;
    self.scrollView.contentOffset = CGPointZero;

    // set some textView's content here
    self.contentView.frame = <rect with new calculated size>;

    self.scrollView.contentSize = self.contentView.frame.size;
    self.scrollView.contentOffset = CGPointZero;
}
Run Code Online (Sandbox Code Playgroud)