我的应用程序使用UINavigationController
,最终视图(详细视图)允许您使用UIWebView
查看应用程序中的外部网站。
我希望在用户查看网页时释放一些额外的屏幕空间并想要模拟iPhone上的Safari如何工作,当您查看内容时,顶部的URL栏向上滚动并离开屏幕在UIWebView
以下的地方。
任何人都有关于如何实现这一目标的想法?如果我设置navigationBarHidden
属性并在顶部滚动我自己的自定义栏并在UIWebView
内设置UIScrollView
,那么UIWebView
中会出现滚动问题,因为它与其他可滚动的视图不能很好地配合。
答案 0 :(得分:4)
根据@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
完全消失。
如果您不添加哑t ableHeaderView
,则可滚动组件似乎在navigationBar
后面滚动。
使用tableHeaderView
,可滚动组件实际上是滚动的(如scrollbar
中所示),但由于有tableHeaderView
的高度与滚动的{offset
完全相同1}},在navigationBar
完全消失之前,可滚动内容似乎不会滚动:
答案 1 :(得分:1)
在UIWebView中拥有滚动事件的委托,当您最初开始滚动UIWebView时,让UIWebView的高度增加并同时降低Y位置,同时在Y方向上向上移动导航栏。导航栏完全移出视图后,停止增加UIWebView的大小,只允许正常滚动。
这会让导航栏在滚动屏幕时成为UIWebView的一部分。
此外,当您向相反方向滚动并到达UIWebView内容的顶部时,您需要执行相反操作。
答案 2 :(得分:0)
不能给你一个直接的答案,但看看iWebKit。也许这提供了一个解决方案该演示至少包含一个“全屏”项目。