UITabBarController中奇怪的界面错误UIScrollView。其他人可以重复?

时间:2013-07-05 20:44:06

标签: ios objective-c uiscrollview uisegmentedcontrol

我的UIScrollView出现了一个奇怪的界面错误,我无法弄清楚如何解决它。 我只写了一行代码(如下所示),这是一个空白项目的设置,很容易重现

环境:

我的UIScrollView包含UISegmentedControl(因为 控件是动态加载的,它可能超过屏幕的宽度,scrollView应该水平滚动segmentedControl,scrollview的高度与UISegmentedControl的相同)。 包含它的ViewController嵌入在tabBar(或导航栏,也显示错误)。整个过程都是使用自动布局。

错误:

当我将SegmentedControl向右滚动一定程度然后通过单击tabBarController上的另一个选项卡切换viewController时,分段控件的内容偏移在切换回初始viewcontroller时会奇怪地移位。当我尝试滚动到滚动视图的最左边部分时,它不会让我。当切换标签几次时,它会再次修复,我可以完成此操作。

我做了什么(你可以重现这个吗?):

  1. 创建空白单视图ios项目
  2. 将已经给定的viewController嵌入tabbarcontroller中。
  3. 在从左到右适合屏幕的视图的上半部分放置一个scrollView。
  4. 将UISegmentedControl放在scrollview的topleft角上,然后拖动scrollview以适合分段控件的高度
  5. 稍微更改分段控件的宽度,以便xcode添加宽度约束。在分段控件的宽度约束中,将宽度约束的关系更改为“大于或等于”
  6. 创建分段控件的出口
  7. 在viewDidload中添加此代码

    [self.segmentedControl insertSegmentWithTitle:@"A really long title so it you have to scroll to see it" atIndex: 0 animated: NO];
    
  8. 创建一个空白视图控制器并将其添加为tabbarController的第二个viewController。

  9. 这就是我的故事板的样子:

    Storyboard with setup

    现在运行项目,将分段控件滚动到它的右端即可。切换选项卡并切换回来,请告诉我你的滚动视图现在的行为 - 以及为什么。

    我的猜测是否与Auto Layout有关?虽然无法弄明白。

    我尝试通过在viewDidAppear中设置scrollView的contentSize或在viewDidAppear中更改scrollView的内容偏移量或更改帧,这些的组合以及不是......来解决此问题。

    额外问题:

    是否不再需要设置scrollViews contentSize属性?为什么会自动滚动内容?

1 个答案:

答案 0 :(得分:2)

googeling后,我在另一个StackOverflow问题中找到了答案。

您需要做的是将scrollview.contentOffset保存在viewWillDisappear上, 将其设置为CGPointZero上的viewDidDisappear并将其设置回viewDidLayoutSubviews上的已保存状态:

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

-(void) viewDidDisappear:(BOOL)animated {
[super viewDidDisappear: animated];
self.scrollView.contentOffset = CGPointZero;
}
- (void)viewDidLayoutSubviews {
[super viewDidlayoutSubviews];
self.scrollView.contentOffset = self.lastContentOffset;
}