UIScrollView で奇妙なインターフェースのバグが発生し、その解決方法がわかりません。私は 1 行のコード (以下を参照) を書いただけで、簡単に再現可能な空のプロジェクトのセットアップです!
設定:
をUIScrollView
含む がありますUISegmentedControl
(コントロールのセグメントは動的に読み込まれるため、画面の幅を超える可能性があり、scrollView は segmentedControl を水平方向にスクロールすることになっているため、scrollview の高さは UISegmentedControl の高さと同じです)。これを含むViewControllerは、タブバー(またはバグを示すナビゲーションバー)に埋め込まれています。全体が自動レイアウトを使用しています。
バグ:
SegmentedControl をある程度右にスクロールしてから、tabBarController の他のタブをクリックして viewController を切り替えると、最初の viewcontroller に戻ると、セグメント化されたコントロールのコンテンツ オフセットが奇妙にシフトします。スクロールビューの左端までスクロールしようとすると、スクロールできません。タブを数回切り替えると、再び修正され、これをやり直すことができます。
私がしたこと(これを再現できますか?):
- 空白のシングルビュー ios プロジェクトを作成する
- 既に指定されている viewController を tabbarcontroller に埋め込みます。
- 画面の左から右に収まるビューの上部に scrollView を配置します。
- スクロールビューの左上隅に UISegmentedControl を配置し、スクロールビューをドラッグしてセグメント化されたコントロールの高さに合わせます
- セグメント化されたコントロールの幅を少し変更して、xcode が幅の制約を追加するようにします。セグメント化されたコントロールの幅の制約で、幅の制約の関係を「以上」に変更します
- セグメント化されたコントロールへのアウトレットを作成する
viewDidload でこのコードを追加します
[self.segmentedControl insertSegmentWithTitle:@"A really long title so it you have to scroll to see it" atIndex: 0 animated: NO];
空のビュー コントローラーを作成し、それを tabbarController の 2 番目のビュー コントローラーとして追加します。
これは私のストーリーボードがどのように見えるかです:
プロジェクトを実行し、セグメント化されたコントロールを右端までスクロールします。タブを切り替えて元に戻し、スクロールビューが現在どのように動作するか、およびその理由を教えてください。
おそらく自動レイアウトと関係があるのではないでしょうか?しかし、何を理解することはできません。
viewDidAppear で scrollView の contentSize を設定するか、viewDidAppear で scrollView のコンテンツ オフセットを変更するか、フレームを変更するか、それらの組み合わせとそうでないものを組み合わせて、これを修正しようとしました。
追加の質問:
scrollViews の contentSize プロパティを設定する必要はなくなりましたか? コンテンツを自動的にスクロールするのはなぜですか?