3

UIScrollView で奇妙なインターフェースのバグが発生し、その解決方法がわかりません。私は 1 行のコード (以下を参照) を書いただけで、簡単に再現可能な空のプロジェクトのセットアップです!

設定:

UIScrollView含む がありますUISegmentedControl(コントロールのセグメントは動的に読み込まれるため、画面の幅を超える可能性があり、scrollView は segmentedControl を水平方向にスクロールすることになっているため、scrollview の高さは UISegmentedControl の高さと同じです)。これを含むViewControllerは、タブバー(またはバグを示すナビゲーションバー)に埋め込まれています。全体が自動レイアウトを使用しています。

バグ:

SegmentedControl をある程度右にスクロールしてから、tabBarController の他のタブをクリックして viewController を切り替えると、最初の viewcontroller に戻ると、セグメント化されたコントロールのコンテンツ オフセットが奇妙にシフトします。スクロールビューの左端までスクロールしようとすると、スクロールできません。タブを数回切り替えると、再び修正され、これをやり直すことができます。

私がしたこと(これを再現できますか?):

  1. 空白のシングルビュー ios プロジェクトを作成する
  2. 既に指定されている viewController を tabbarcontroller に埋め込みます。
  3. 画面の左から右に収まるビューの上部に scrollView を配置します。
  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 の 2 番目のビュー コントローラーとして追加します。

これは私のストーリーボードがどのように見えるかです:

セットアップ付きストーリーボード

プロジェクトを実行し、セグメント化されたコントロールを右端までスクロールします。タブを切り替えて元に戻し、スクロールビューが現在どのように動作するか、およびその理由を教えてください。

おそらく自動レイアウトと関係があるのではないでしょうか?しかし、何を理解することはできません。

viewDidAppear で scrollView の contentSize を設定するか、viewDidAppear で scrollView のコンテンツ オフセットを変更するか、フレームを変更するか、それらの組み合わせとそうでないものを組み合わせて、これを修正しようとしました。

追加の質問:

scrollViews の contentSize プロパティを設定する必要はなくなりましたか? コンテンツを自動的にスクロールするのはなぜですか?

4

1 に答える 1

2

グーグルで調べた後、別のStackOverflowの質問で答えを見つけました。

あなたがする必要があるのは、 on を保存scrollview.contentOffsetviewWillDisappear、それを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 に答える