UITableView についてカスタマイズされたヘッダーが必要な状況で、この動作をエミュレートしようとしていました。これはページ上の他の多くのものの下にあり、セクションヘッダーがデフォルトの「ドッキング」動作に従うようにしたかったので、私は独自の「ナビゲーション」バーをロールしました。私は、UITableView/UIScrollView を別のオブジェクトと一緒に、Facebook/Instagram/Chrome などで見られるのと同様のスタイルで調整するための、かなり巧妙で簡潔な方法を見つけたと思います。アプリ。
私の .xib ファイルでは、コンポーネントをフリーフォーム ビューにロードしています: http://imgur.com/0z9yebJ (申し訳ありませんが、画像をインライン化する担当者はいません)
左側のサイドバーでは、テーブルがメイン ヘッダー ビューの後ろに配置されていることに注意してください。スクリーンショットからはわかりませんが、メインのヘッダー ビューと同じ y 位置もあります。見えなくなっているため、UITableView の contentInset プロパティは 76 (メイン ヘッダー ビューの高さ) に設定されています。
UIScrollView と連動してメイン ヘッダー ビューをスライドさせるには、UIScrollViewDelegate の scrollViewDidScroll メソッドを使用していくつかの計算を実行し、UIScrollView の contentInset とメイン ヘッダー ビューのフレームを変更します。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
UIEdgeInsets insets = scrollView.contentInset;
//tableViewInsetDelta and tableViewOriginalInsetValue are NSInteger variables that I set to 0 and 76, respectively, in viewDidLoad
tableViewInsetDelta = tableViewOriginalInsetValue + scrollView.contentOffset.y;
insets.top = tableViewOriginalInsetValue - tableViewInsetDelta;
if (scrollView.contentOffset.y > -76 && scrollView.contentOffset.y < 0) {
[scrollView setContentInset:insets];
self.pathTitleContainer.frame = CGRectMake(self.pathTitleContainer.frame.origin.x, 44 - tableViewInsetDelta, self.pathTitleContainer.frame.size.width, self.pathTitleContainer.frame.size.height);
} else if (scrollView.contentOffset.y > 0) {
insets.top = 0;
[scrollView setContentInset:insets];
self.pathTitleContainer.frame = CGRectMake(self.pathTitleContainer.frame.origin.x, -32, self.pathTitleContainer.frame.size.width, self.pathTitleContainer.frame.size.height);
} else if (scrollView.contentOffset.y < -76) {
insets.top = 76;
[scrollView setContentInset:insets];
self.pathTitleContainer.frame = CGRectMake(self.pathTitleContainer.frame.origin.x, 44, self.pathTitleContainer.frame.size.width, self.pathTitleContainer.frame.size.height);
}
}
最初のifステートメントは手間のかかる作業のほとんどを行いますが、ユーザーが無理にドラッグし、scrollViewDidScroll に送信される contentOffset の初期値が最初のifステートメントの範囲外である状況に対処するために、他の 2 つを含める必要がありました。
最終的に、これは私にとって非常にうまく機能しています。肥大化したサブクラスの束をプロジェクトに積み込むのは嫌いです。これがパフォーマンスの点で最良のソリューションであるかどうかはわかりません (常に呼び出されるため、scrollViewDidScroll にコードを配置することを常に躊躇してきました) が、コードのフットプリントは、これまでに見た中で最小です。この問題の解決策であり、UIScrollView で UITableView をネストする必要はありません (Apple はドキュメントでこれに対してアドバイスしており、タッチ イベントは UITableView で少しファンキーになります)。これが誰かを助けることを願っています!