在UINavigationController推送和弹出后,UIScrollView子项跳转

所以我在我的iPad应用程序上有一个UIScrollView ,它有一个子视图(它本身就是所有控件的父视图)。 滚动一切正常。 旋转工作正常(整个视图适合纵向,在风景上滚动)。 一旦在UINavigationController上推出一个新的屏幕,然后再回来打破它。

看起来滚动视图的子框架相对于滚动位置向上移动,但滚动视图保持在底部(整个子视图向上移动)。

我已经尝试在故事板中对抗Constraints ,几个小时,并且无法解决可能导致这种情况的原因。

它是如何开始的导航和返回后的样子

我有滚动视图和自动布局相同的问题(iOS 6 – 不起作用,iOS 7 – 工作正常),当然这不是完美的解决方案,但似乎它的工作原理。 希望它能帮到你:

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self performSelector:@selector(content) withObject:nil afterDelay:0.0]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; offset = self.scrollView.contentOffset; } - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; self.scrollView.contentOffset = CGPointZero; } - (void)content { [self.scrollView setContentOffset:offset animated:NO]; } 

在子视图消失之前获取子视图的帧,然后每次视图出现时手动重置子视图的帧 – (void)viewWillAppear:(BOOL)动画。

 -(void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; globalFrameVariable = subview.frame; [subview removeFromSuperview]; } -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [subview setFrame:globalFrameVariable]; [scrollView addSubview:subview]; } 

这是我发现的一个简单的解决方案。 (假设父视图意图跨越整个contentSize)使用UIScrollView的这个子类:

 @interface BugFixScrollView : UIScrollView @end @implementation BugFixScrollView -(void)layoutSubviews { [super layoutSubviews]; UIView *view=[self.subviews firstObject]; if(view) { CGRect rect=view.frame; rect.origin=CGPointMake(0, 0); view.frame=rect; } } @end 

它只是在每次自动布局混乱时重置原点。 只需在放置UIScrollView后更改类名,就可以在InterfaceBuilder中使用此类。