当contentSize改变时,UIScrollView调整contentOffset

我正在调整一个详细视图控制器的状态,就在它被推上一个navigationController

 [self.detailViewController detailsForObject:someObject]; [self.navigationController pushViewController:self.detailViewController animated:YES]; 

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; } 

现在,这一切工作,但scrollView在导航控制器的滑入animation中调整它的contentOffsetcontentOffset将被设置为最后一个contentSize和新计算的之间的差异。 这意味着第二次打开detailsView时,细节会滚动到一些不需要的位置。 即使我明确地将contentOffset设置为CGPointZero

我发现在- viewWillAppear中重置contentOffset不起作用。 我能想到的最好的方法是重置viewDidAppear的contentOffset,从而引起内容的明显上下移动:

 - (void)viewDidAppear:(BOOL)animated { self.scrollView.contentOffset = CGPointZero; } 

有没有一种方法来防止一个UIScrollViewcontentSize更改时调整其contentOffset

在使用UINavigationController推送包含UIScrollViewUIViewController时发生。

IOS 7

解决scheme1(代码)

设置@property(nonatomic, assign) BOOL automaticallyAdjustsScrollViewInsets调整@property(nonatomic, assign) BOOL automaticallyAdjustsScrollViewInsetsNO

解决scheme2(Storyboard)

取消选中Adjust Scroll View Insets

调整滚动查看插图

iOS 6

解决scheme(代码)

viewWillLayoutSubviews设置UIScrollView的属性contentOffsetcontentInset 。 示例代码:

 - (void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; self.scrollView.contentOffset = CGPointZero; self.scrollView.contentInset = UIEdgeInsetsZero; } 

这个问题的原因仍不清楚,但我find了解决办法。 通过在调整内容之前重置内容大小和偏移量,UIScrollView将不会animation:

 - (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; } 

我有一个UIScrollview相同的问题,其中的问题是由于没有设置contentSize造成的。 将contentSize设置为解决此问题的项目数量后。

 self.headerScrollView.mainScrollview.contentSize = CGSizeMake(320 * self.sortedMaterial.count, 0); 

你的scrollView是DetailViewController的根视图吗? 如果是的话,试着将scrollView包装在一个普通的UIView ,并使后者成为DetailViewController的根视图。 由于UIView没有contentOffset属性,因此它们不受导航控制器(由于导航栏等)所做的内容偏移调整的限制。

我遇到了这个问题,对于一个特定的情况 – 我不resize – 我使用了以下内容:

 float position = 100.0;//for example SmallScroll.center = CGPointMake(position + SmallScroll.frame.size.width / 2.0, SmallScroll.center.y); 

同样可以和y: anotherPosition + SmallScroll.frame.size.height / 2.0

所以如果你不需要resize,这是一个快速和无痛的解决scheme。

Interesting Posts