当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中调整它的contentOffset
。 contentOffset
将被设置为最后一个contentSize和新计算的之间的差异。 这意味着第二次打开detailsView时,细节会滚动到一些不需要的位置。 即使我明确地将contentOffset
设置为CGPointZero
。
我发现在- viewWillAppear
中重置contentOffset
不起作用。 我能想到的最好的方法是重置viewDidAppear
的contentOffset,从而引起内容的明显上下移动:
- (void)viewDidAppear:(BOOL)animated { self.scrollView.contentOffset = CGPointZero; }
有没有一种方法来防止一个UIScrollView
的contentSize
更改时调整其contentOffset
?
在使用UINavigationController
推送包含UIScrollView
的UIViewController
时发生。
IOS 7
解决scheme1(代码)
设置@property(nonatomic, assign) BOOL automaticallyAdjustsScrollViewInsets
调整@property(nonatomic, assign) BOOL automaticallyAdjustsScrollViewInsets
为NO
。
解决scheme2(Storyboard)
取消选中Adjust Scroll View Insets
iOS 6
解决scheme(代码)
在viewWillLayoutSubviews
设置UIScrollView
的属性contentOffset
和contentInset
。 示例代码:
- (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。