我的应用程序使用 UINavigationController
,最终 View (详细 View )允许您使用 UIWebView
在应用程序中查看外部网站。
我想在用户查看网页时释放一些额外的屏幕空间,并想模拟 iPhone 上的 Safari 的工作方式,当您查看内容时,他们顶部的 URL 栏会向上滚动并离开屏幕在折叠下方的 UIWebView
中。
有人知道如何实现这一点吗?如果我设置 navigationBarHidden
属性并在顶部滚动我自己的自定义栏,并在 UIScrollView
中设置它和 UIWebView
那么就会出现滚动问题在 UIWebView
中,因为它不能很好地与其他可 ScrollView 一起播放。
最佳答案
根据@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 完全消失。我首先尝试将 contentOffset
.y 更改为 0,但显然它不起作用,因为所有代码都依赖于滚动机制。所以我只是添加了一个 tableHeaderView
,它的高度恰好是滚动的偏移量,因此从未真正看到标题,并且内容似乎不会滚动,直到 navigationBar
完全消失。
如果您不添加哑 tableHeaderView
,则可滚动组件似乎在 navigationBar
后面滚动。
对于 tableHeaderView
,可滚动组件实际上是滚动的(如 scrollbar
所示),但是因为有一个 tableHeaderView
,它的高度与滚动的 offset
完全相同,可滚动的内容在 navigationBar
完全消失之前似乎没有滚动:
关于objective-c - 类似于 Mobile Safari 的可滚动 UINavigationBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1263180/