3

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

环境:

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

漏洞:

当我将 SegmentedControl 向右滚动一定程度,然后通过单击 tabBarController 上的另一个选项卡来切换视图控制器时,当切换回初始视图控制器时,分段控件的内容偏移量会奇怪地移动。当我尝试滚动到滚动视图的最左侧时,它不会让我这样做。切换几次选项卡时,它又被修复了,我可以重新做一遍。

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

  1. 创建一个空白的单视图ios项目
  2. 将已经给定的 viewController 嵌入到 tabbarcontroller 中。
  3. 在从左到右适合屏幕的视图上部放置一个滚动视图。
  4. 在滚动视图的左上角放置一个 UISegmentedControl 并拖动滚动视图以适应分段控件的高度高度
  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 的第二个视图控制器。

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

带有设置的故事板

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

我的猜测可能与自动布局有关?虽然想不通是什么。

我尝试通过在 viewDidAppear 中设置 scrollView 的 contentSize 或在 viewDidAppear 中更改 scrollView 的内容偏移量或更改帧、这些的组合以及其他什么来解决这个问题......

额外的问题:

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

4

1 回答 1

2

谷歌搜索后,我在另一个 StackOverflow 问题中找到了答案。

您需要做的是保存scrollview.contentOffseton viewWillDisappear,将其设置为CGPointZeroonviewDidDisappear并将其设置回保存状态 on 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;
}
于 2013-07-07T11:18:10.917 回答