UITableViewについてカスタマイズされたヘッダーが必要な状況で、この動作をエミュレートしようとしていました。独自の「ナビゲーション」バーをロールバックしました。これは、ページ上の他の多くのものの下にあり、セクションヘッダーがデフォルトの「ドッキング」動作に従うようにしたためです。Facebook / Instagram / Chrome /などで見られるのと同じようなスタイルで、UITableView / UIScrollViewを別のオブジェクトと一緒に調整するためのかなり巧妙で簡潔な方法を見つけたと思います。アプリ。
私の.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で少しファンキーになります)。これが誰かを助けることを願っています!