このページの以前の解決策では、これをセクション タイトルとインデックス バーと一緒に機能させる必要があるときに問題が発生したため、次の代替案を自分で思いつきました。ご注意ください; 私は自分のプロジェクトで autolayout を使用しておらず、これを iOS9+ でのみテストしました。
プロジェクトのストーリーボードで:
- UIViewController 内に UITableView を作成します (または UITableViewController で試してください)。
- UIView を UITableView の上部 (ただし内部) にドロップすると、最初のセルの上のテーブル ヘッダーになります。
- このヘッダー ビューに希望の高さ (たとえば 200px など) を指定し、背景色を「クリア カラー」に設定します。クリアな色が重要です。ビューはシースルーである必要があります。
- テーブル ヘッダー UIView 内に 2 番目の UIView をドロップし、親と同じサイズにします。これが実際のヘッダーになるので、自由に色を付けたり、画像ビューやその他のコンテンツを設定したりしてください。
- この 2 番目の UIView を UIViewController IBOutlet に接続します。私の場合は「headerView」と名付けました。
次に、UIViewController.m に移動します。
- (void)viewDidLoad
{
[super viewDidLoad];
// Remove view from table header and place it in the background instead.
[self.headerView removeFromSuperview];
UIView *backgroundView = [UIView new];
[backgroundView addSubview:self.headerView];
self.tableView.backgroundView = backgroundView;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
/* Set initialScrollOffset ivar to start offset, because in my case
the scroll offset was affected by the statusbar + navigation bar heights
and the view controller's "extend edges under top bars" option. */
initialScrollOffset = self.tableView.contentOffset.y;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
/* Modify headerView height only if the table content gets pulled
beyond initial offset. */
if (scrollView.contentOffset.y < initialScrollOffset) {
CGRect frame = self.headerView.frame;
frame.size.height = self.tableView.tableHeaderView.frame.size.height + -scrollView.contentOffset.y;
self.headerView.frame = frame;
}
}
この実装は、背景色とラベルを持つストレッチ ヘッダーにのみ必要でした。ただし、このヘッダーに UIImageView を追加するのは簡単なはずです。
また、ステップ 1 ~ 5 はもちろん完全にオプションです。プログラムでヘッダー ビューを作成するか、代わりに XIB を使用できます。これは、セルとセクションのタイトルを一列に並べるためのスペーサーとして機能するため、テーブルに目的のヘッダーと同じ高さのクリアカラーヘッダービューが設定されていることを確認する限り.
編集:
これを達成するためのさらにクリーンな方法を見つけました。
- 上記のように、インターフェイス ビルダーでテーブル ヘッダーを作成します。
- 上記のコードをスキップし
viewDidLoad
ます。UIView をコンテナーから引き出す必要はなく、テーブルの背景として設定する必要もありません。
scrollViewDidScroll:
メソッドを次のように変更します。
UIViewController.m:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (scrollView.contentOffset.y < initialScrollOffset) {
CGRect frame = self.headerView.frame;
frame.size.height = self.tableView.tableHeaderView.frame.size.height - scrollView.contentOffset.y;
frame.origin.y = self.tableView.tableHeaderView.frame.origin.y + scrollView.contentOffset.y;
self.headerView.frame = frame;
}
}
それでおしまい。他のソリューションとの視覚的な違いは、コンテンツが他のセルと重なるのではなく、残りのセルと一緒にスクロールアップすることだけです。