根据@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 中的出现是在导航栏完全消失之前内容不会滚动。我首先尝试将contentOffset
.y 更改为 0,但显然它不起作用,因为所有代码都依赖于滚动机制。所以我只是添加了一个tableHeaderView
高度正好是滚动偏移量的,所以标题永远不会真正看到,并且内容似乎不会滚动,直到navigationBar
完全消失。
如果您不添加哑 t ableHeaderView
,则可滚动组件会出现在navigationBar
.
使用tableHeaderView
,可滚动组件实际上正在滚动(如 中所示scrollbar
),但由于存在tableHeaderView
高度与已滚动 完全相同的offset
,因此可滚动内容似乎不会滚动,直到navigationBar
完全消失: