popup回UIViewController后,UIScrollView的原点发生了变化

我有一个UIViewController子类作为故事板中的场景,其中包含一个包含各种子视图的UIScrollView 。 其中一个子视图是一个UIButton ,它进入另一个场景UIViewController子类。 当我从视图返回(从导航控制器堆栈popupUIViewController )时,我发现滚动视图的原点已经有所改变,尽pipecontentoffsetcontentoffset看起来是正确的。

还有一个有趣的地方是应用程序有一个标签栏,当我退回到该视图时,滚动视图被正确设置,偏移量为(0,0)。

这个过程基本上没有任何代码,因为它几乎全都在故事板上。 由于我对故事板的使用相当新颖,我认为我做错了什么,虽然我不知道是什么。 任何想法可能是什么? 也许大小问题或约束?

在iOS 7/8/9简单的self.automaticallyAdjustsScrollViewInsets = NO; 在我的情况下解决了这个问题。

试试这个viewWillAppear你回到视图控制器:

  self.scrollView.contentOffset = CGPointMake(0, 0); 

编辑:同时添加彼得的代码,你会得到最好的结果:

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:YES]; self.scrollView.contentOffset = CGPointMake(0, 0); } 

 - (void)viewWillDisappear:(BOOL)animated { self.recentContentOffset = self.scrollView.contentOffset; [super viewWillDisappear:animated]; } 

 - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; self.scrollView.contentOffset = CGPointMake(0, self.recentContentOffset.y); } 

你回到原来的滚动位置,没有视觉上的副作用,滚动视图本身正确地定位在它的超视图(这是一个问题)。

实际上,我把这行代码放在viewDidDisappear ,所以当视图重新出现的时候它会记住这个偏移量,我在它之前加了这行代码

  self.contentOffset = self.scrollView.contentOffset; 

以及

  - (void)viewDidLayoutSubviews { self.scrollView.contentOffset = self.contentOffset; } 

我有一个类似的问题,解散一个viewController后,我的tableView的contentOffset被改为(0,-64)。

我的解决scheme有点奇怪,我试过所有其他的答案,但没有成功,唯一解决我的问题是切换.xib的控制树中的tableView位置

这是在父视图中的第一个控件像这样:

之前

我在ImageView之后移动了tableView,它工作正常:

后

似乎把表视图放在第一个位置是造成麻烦,并将表视图移动到另一个位置解决了问题。

PD我没有使用autoLayout都不是故事板

希望这可以帮助别人!

我正在使用一个collectionView,我有一个类似的问题。 对于iOS 11:在尺寸检查器中,存在“内容插入”。 将其设置为“从不”。 这解决了我的问题。 我希望这可以帮助别人。

目标C:

 if (@available(iOS 11, *)) { [UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; } 

迅速:

 if #available(iOS 11, *) { UIScrollView.appearance().contentInsetAdjustmentBehavior = .never } 

不幸的是,彼得和麦克马克的build议没有为我工作(Xcode 5瓦特/自动布局)。 解决scheme是转到故事板,select视图控制器,并Reset to Suggested Constraints in View Controller

在这里输入图像说明

我最近发布了一个关于类似问题的问题,但是在不同的上下文中: 在解除模态视图控制器之后,框架不反映自动布局约束

在我的情况下,滚动视图内的自定义容器视图的原点被移位,而不是滚动视图本身的原点。 关于自动布局,自定义容器视图被固定在滚动视图的四边。

容器视图是以编程方式创build和configuration的,而不是在IB中。 尽pipe容器视图的约束没有改变,但在closures模态视图控制器之后,容器视图的原点被移开。 约束和框架之间的这种断开是莫名其妙的。

更为显着的是,我删除并重新添加了所有相关的约束条件后,原始位移问题仍然存在。

我想出了一个类似的解决scheme:保存当前内容偏移量的值,将内容偏移量设置为“零”,让系统交换出你的视图,然后恢复内容偏移量(即内容偏移量)。

但就我而言,我不得不采取额外的措施来解决这个问题。 我的滚动视图是一个分页滚动视图,从tilePages方法获取其子视图(在旧的WWDCvideo中演示)。 更改滚动视图的内容偏移量会通过UIScrollViewDelegate的scrollViewDidScroll:方法触发tilePages方法。 我必须设置一个标志来closurestilePages,而我做了内容偏移舞蹈,否则应用程序会崩溃。

希望当我升级到iOS 7时,我可以删除内容偏移舞蹈的代码。

继续当前答案的问题:

第二次尝试打开呈现的视图控制器,没有离开呈现视图控制器,问题依然存在。 这就是为什么我张贴导致我的解决scheme的确切步骤

  1. 所以,我重置了Storyboard中的collectionView的约束,确定它们被固定为呈现ViewController的主视图。

  2. 补充self.view.translatesAutoresizingMaskIntoConstraints = YES; 在呈现视图控制器的viewDidLoad中。

  3. 并且在模态呈现的视图控制器的外观之前私下存储集合视图的contentOffset:

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

最近,我遇到了这个bug,可以用这些代码来解决:

 // fix ios 6 bug begin - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7) { isRecoredforios6 = YES; recordedOffsetforios6 = self.tableView.contentOffset; recordedSizeforios6 = self.tableView.contentSize; } } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; if (isRecoredforios6) { isRecoredforios6 = NO; self.tableView.contentSize = recordedSizeforios6; self.tableView.contentOffset = recordedOffsetforios6; } } // fix ios 6 bug end 

感谢Peter Jacobs!

 - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7) { _isRecoredforios6 = YES; _recordedOffsetforios6 = _scrollView.contentOffset; _recordedSizeforios6 = _scrollView.contentSize; _scrollView.contentOffset = CGPointZero; } } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; if (_isRecoredforios6) { _isRecoredforios6 = NO; _scrollView.contentSize = _recordedSizeforios6; _scrollView.contentOffset = _recordedOffsetforios6; } } 

我已经修复了这个ios6的bug,可以用这些代码解决。 我解决了Scrollview中发生的错误。 首先感谢我的朋友!

尝试了很多东西之后:

  • 自动将AdjustsScrollViewInsets设置为false,以查看问题是否出现在导航栏中。
  • 玩固定的细胞高度…
  • caching单元格高度…
  • 保持与表视图偏移属性,caching它,并将其设置viewWillAppear …
  • 等等

我意识到这个问题是关于estimatedRowHeight RowHeight值,它被设置为50px,当它应该是〜150px。 更新值解决了问题,现在表视图保持相同的偏移量。

您是否尝试过检查“不透明酒吧”下的“延伸边缘”选项? 它可以在故事板内的控制器属性检查器中find。

它为我使用XCode 9 iOS 11做了窍门。

在这里输入图像说明

否则,closures该xib的AutoLayout选项