UIScrollview Autolayout问题

我有一个自动布局(也许)和我的滚动查看问题!

我的问题

  1. 我向下滚动 视图

然后我推到另一个视图

3.然后我回去,滚动视图看起来像这样,我不能滚动到最高点(我在滚动视图的弹跳看到它) 滚动型

有谁能够帮助我?

包含视图控制器中的以下代码片段也似乎解决了问题,而不依赖于显式大小:

- (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; self.mainScrollView.contentOffset = CGPointZero; } 

它将内容偏移重置为原点,但其他答案似乎也如此。

如果你仍然在寻找答案,那么在两天之后,我发现了这个答案。 我只会粘贴你的代码,但最重要的是当你加载你的scrollView ..

  -(void)viewWillAppear:(BOOL)animated{ [scrollView setFrame:CGRectMake(0, 0, 320, 800)]; } -(void)viewDidAppear:(BOOL)animated { [scrollView setScrollEnabled:YES]; [scrollView setContentSize:CGSizeMake(320, 800)]; } 

所有这些都加载之前-(void)viewDidLoad

注意高度在两种情况下都是800,这对于解决这个问题是至关重要的。 祝你好运!)

我正在使用亚当的解决scheme,但开始有问题,当我解雇animation:是。 在我的代码中,内容偏移在viewWillAppear(viewWillAppear显得太快)之后被设置了一段时间。

 - (void)viewDidDisappear:(BOOL)animated { self.scrollOffsetToPersist = self.scrollView.contentOffset; self.scrollView.contentOffset = CGPointZero; [super viewDidDisappear:animated]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[NSOperationQueue mainQueue] addOperationWithBlock:^ { self.scrollView.contentOffset = self.scrollOffsetToPersist; }]; } 

编辑:另一种更好的方法是将其重置回viewDidLayoutSubviews 🙂

 - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; if(!CGPointEqualToPoint(CGPointZero, self.scrollOffsetToPersist)) { self.scrollView.contentOffset = self.scrollOffsetToPersist; self.scrollOffsetToPersist = CGPointZero; } } 

这不是很好,但我自动布局(绝对不是正确的方式,但我不习惯尝试!)通过设置内容的大小在viewDidAppear自动布局发生后,设置scrollOffset并保持viewDidDisappear中的滚动偏移量,然后设置在viewDidAppear中,滚动偏移回它的持久状态。

喜欢这个:

 -(void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:YES]; self.scrollView.contentSize = self.scrollViewInnerView.frame.size; self.scrollView.contentOffset = [self.scrollOffsetToPersist CGPointValue]; } -(void)viewDidDisappear:(BOOL)animated{ [super viewDidDisappear:YES]; self.scrollOffsetToPersist = [NSValue valueWithCGPoint:self.scrollView.contentOffset]; self.scrollView.contentOffset = CGPointZero; } 

一点都不高雅,但我认为我会分享的作品。

我使用UITabBarController和不同的视图与自动布局。 视图比设备的屏幕更长。 从一个标签切换到另一个标签有时会导致您所描述的问题。 只有当视图在切换之前被滚动下来才会发生。 我在这里尝试了所有的build议,但这不适合我的情况。 我的解决scheme是在离开视图之前再次向上滚动。 至less在iOS 6中解决这个错误的方法是:

 -(void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [scrollView setContentOffset:CGPointZero animated:NO]; } 

问题原因应用AutoLayout之前,ScrollView被设置为ContentOffset。 解决scheme是:

创build私有财产

 @property (assign,nonatomic) CGPoint scrollviewContentOffsetChange; 

添加代码来查看方法

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.scrollView.contentOffset = CGPointZero; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; self.scrollviewContentOffsetChange = self.scrollView.contentOffset; } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; self.scrollView.contentOffset = self.scrollviewContentOffsetChange; } 

你有尝试过吗?

 self.automaticallyAdjustsScrollViewInsets = NO; 

在我的情况下,这是什么解决了我的问题。

我有同样的问题。 原来,我在内容视图上设置了一个约束,将其y中心alignment到超视图的y中心。 当我删除这个约束它工作得很好。

尝试这个

 @property (nonatomic, assign) CGPoint scrollViewContentOffsetChange; - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.scrollView.contentOffset = CGPointZero; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; self.scrollViewContentOffsetChange = _scrollView.contentOffset; } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; _scrollView.contentOffset = self.scrollViewContentOffsetChange; }