可滚动的UINavigationBar类似于Mobile Safari

时间:2009-08-11 21:56:12

标签: objective-c uiwebview uinavigationcontroller uinavigationbar mobile-safari

我的应用程序使用UINavigationController,最终视图(详细视图)允许您使用UIWebView查看应用程序中的外部网站。

我希望在用户查看网页时释放一些额外的屏幕空间并想要模拟iPhone上的Safari如何工作,当您查看内容时,顶部的URL栏向上滚动并离开屏幕在UIWebView以下的地方。

任何人都有关于如何实现这一目标的想法?如果我设置navigationBarHidden属性并在顶部滚动我自己的自定义栏并在UIWebView内设置UIScrollView,那么UIWebView中会出现滚动问题,因为它与其他可滚动的视图不能很好地配合。

3 个答案:

答案 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后面滚动。

enter image description here

使用tableHeaderView,可滚动组件实际上是滚动的(如scrollbar中所示),但由于有tableHeaderView的高度与滚动的{offset完全相同1}},在navigationBar完全消失之前,可滚动内容似乎不会滚动:

enter image description here

答案 1 :(得分:1)

在UIWebView中拥有滚动事件的委托,当您最初开始滚动UIWebView时,让UIWebView的高度增加并同时降低Y位置,同时在Y方向上向上移动导航栏。导航栏完全移出视图后,停止增加UIWebView的大小,只允许正常滚动。

这会让导航栏在滚动屏幕时成为UIWebView的一部分。

此外,当您向相反方向滚动并到达UIWebView内容的顶部时,您需要执行相反操作。

答案 2 :(得分:0)

不能给你一个直接的答案,但看看iWebKit。也许这提供了一个解决方案该演示至少包含一个“全屏”项目。