@Brian の提案に基づいて、このコードを作成しました。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat height = navigationBar.frame.size.height;
CGFloat y = scrollView.bounds.origin.y;
if (y <= 0) {
CGRect frame = navigationBar.frame;
frame.origin.y = 0;
navigationBar.frame = frame;
} else if (tableView.contentSize.height > tableView.frame.size.height) {
CGFloat diff = height - y;
CGRect frame = navigationBar.frame;
frame.origin.y = -y;
navigationBar.frame = frame;
CGFloat origin = 0;
CGFloat h = height; // height of the tableHeaderView
if (diff > 0) {
origin = diff;
h = y;
}
frame = tableView.frame;
frame.origin.y = origin;
frame.size.height = tableView.superview.frame.size.height - origin;
tableView.frame = frame;
CGRect f = CGRectMake(0, 0, tableView.frame.size.width, h);
UILabel* label = [[UILabel alloc] initWithFrame:f];
tableView.tableHeaderView = label;
[label release];
}
}
私のコードにはUITableView
がありますが、スクロール可能なコンポーネントで動作するはずです。navigationBar とサブクラス以外のコンポーネントがある場合UIScrollView
は、スクロール可能なコンポーネントの高さの計算方法を変更する必要があります。このようなもの:
frame.size.height = tableView.superview.frame.size.height - origin - otherComponentsHeight;
tableHeaderView
望ましい動作をさせるには、ダムを追加する必要がありました。問題は、scrollViewDidScroll: が呼び出されたときにコンテンツにオフセットがあることですが、Mobile Safari では、navigationBar が完全に消えるまでコンテンツがスクロールされないことがわかりました。最初に .y を 0 に変更しようとしcontentOffset
ましたが、すべてのコードがスクロール メカニズムに依存しているため、明らかにうまくいきませんでした。そのため、高さがスクロールされたオフセットと正確に一致する を追加したtableHeaderView
ので、ヘッダーは実際には表示されず、 がnavigationBar
完全に消えるまでコンテンツはスクロールしないように見えます。
ダム t を追加しない場合ableHeaderView
、スクロール可能なコンポーネントは . の後ろにスクロールするように見えますnavigationBar
。
を使用するtableHeaderView
と、スクロール可能なコンポーネントは実際にはスクロールします ( をscrollbar
参照)。ただし、tableHeaderView
高さが scrolled とまったく同じ があるため、スクロールoffset
可能なコンテンツは、 がnavigationBar
完全に消えるまでスクロールしていないように見えます。