2016-04-12 7 views
4

私はUITableViewを持っています。ナビゲーションバーには、セグメント化されたコントロールがあります。セグメント化されたコントロールの選択されたインデックスに基づいて、同じテーブルビューを使用して3つの異なるデータセットを表示しています。私は現在、各セグメントオプションのスクロール位置を保持しようとしているので、各セグメントオプションごとに1つのテーブルが存在するようになっています(つまり、各選択の結果に独立したスクロール位置があります)。これを行うにはセグメント化されたコントロールを使用するとUITableView contentOffsetが変わるのはなぜですか?

、私はcontentOffsetときに選択されたセグメントの屈折率変化にに設定され、各状態に対して1つのCGPoint変数を格納しています。変数は、を使用して、セグメント変更時にテーブルビューのコンテンツオフセットを設定します。

ただし、選択したセグメントインデックスがテーブル内の位置に目に見える変化を伴わずに変更された場合、値はcontentOffsetのように変わります。これは、コンテンツオフセットの0の位置が移動しているので、格納された値が間違っています。私のコントローラには、次のメソッドが含まれてい

:私はログインして次の取得

override func viewDidLoad() { 
    // set up the view here...   

    print(tableView.contentOffset) 
} 

@IBAction func selectedSegmentChanged(sender: AnyObject) { 
    print(tableView.contentOffset) 

    // code to change the data shown in the table view... 
} 

たときにビューをロード:

(0.0、0.0)

が、変更した後、私は得る:

(0.0、-64.0)

すべての州では、テーブルビューがまったく同じ位置にスクロールされて表示されます。つまり、上部に表示されます。

この現象は、コンテンツオフセットの「意味」が変化しているように見えるため、スクロール位置を適切に保存できなくなっています。


編集:オフセットコンテンツは、実際にviewDidLoad()viewDidAppear()の間で調整されている、最も可能性が高いため、コンテンツインセットへ。だから私は今初めてviewDidAppear()が呼び出されたときにコンテンツのオフセット値を保存しています。

答えて

4

この問題は、通常、View Controllerのプロパティによって発生します。 falseに設定すると修正されます。

self.automaticallyAdjustsScrollViewInsets = false 

ストーリーボードから設定することもできます。 View Controllerを選択してAdjusts scroll view insetsのチェックを外してください。

+0

Thanks - 私が_Adjusts Scroll View Insets_オプションを無効にすると、ログに '(0,0)、(0,0)'が表示され、問題を修正することが示唆されます。しかし、このビューコントローラはナビゲーションコントローラからリンクされているので、そのオプションが無効になっていると、テーブルの最上部の結果がナビゲーションバーの下に隠されます。代わりに手動でインセットを設定する必要がありますか? –

+0

これを行うか、自動調整機能をオンにするロジックを変更してください。 – Jelly

+0

自動調整をオンにしながら、問題を解決するためにロジックを変更するにはどうすればよいですか? 'contentOffset'の再計算をトリガーする方法がありますので、-64調整に対応できますか?または、調整がどのようになるかを判断する方法はありますか? –

関連する問題