Основываясь на предложении @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
, но должен работать с любым прокручиваемым компонентом. Если у вас есть другие компоненты, кроме навигационной панели и подкласса UIScrollView
, вам следует изменить способ вычисления высоты прокручиваемого компонента. Как то так:
frame.size.height = tableView.superview.frame.size.height - origin - otherComponentsHeight;
Мне нужно было добавить немой tableHeaderView
, чтобы иметь желаемое поведение. Проблема заключалась в том, что при вызове scrollViewDidScroll: содержимое имеет смещение, но, по-видимому, в Mobile Safari содержимое не прокручивается до полного исчезновения навигационной панели. Сначала я попытался изменить contentOffset
.y на 0, но, очевидно, это не сработало, поскольку весь код использует механизм прокрутки. Поэтому я просто добавил tableHeaderView
, высота которого точно равна смещению прокрутки, поэтому заголовок действительно никогда не виден, и содержимое, по-видимому, не прокручивается, пока navigationBar
полностью не исчезнет.
Если вы не добавите немой т ableHeaderView
, то прокручиваемый компонент появится для прокрутки за navigationBar
.
С tableHeaderView
прокручиваемый компонент фактически прокручивается (как видно из scrollbar
), но, поскольку есть tableHeaderView
, высота которого точно равна прокручиваемой offset
, прокручиваемое содержимое появляется не прокручивать, пока navigationBar
полностью не исчезнет: