【问题标题】:Scrollable UINavigationBar similar to Mobile Safari类似于 Mobile Safari 的可滚动 UINavigationBar
【发布时间】:2009-08-11 21:56:12
【问题描述】:

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

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

有人对如何实现这一目标有想法吗?如果我设置navigationBarHidden 属性并在顶部滚动我自己的自定义栏并在UIScrollView 中设置它和UIWebView,那么UIWebView 中存在滚动问题,因为它不能很好地与其他可滚动意见。

【问题讨论】:

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


【解决方案1】:

根据@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 完全消失之前,内容似乎不会滚动。

如果不添加哑 tableHeaderView,则可滚动组件会出现在 navigationBar 后面滚动。

使用tableHeaderView,可滚动组件实际上是滚动的(如scrollbar所示),但由于有一个tableHeaderView的高度与滚动后的offset完全相同,因此出现了可滚动内容在navigationBar 完全消失之前不要滚动:

【讨论】:

  • 我想用 UIWebview 做同样的效果?我怎样才能做到这一点?因为它没有标题视图,所以很难。现在我只是移动导航栏,并且有相同的网络视图框架,我没有打开剪辑子视图,所以我可以看到仍然并且它得到了效果,但它不允许触摸!所以我不能在顶部滚动,有些人可能会这样,这对我来说可能是个问题。
【解决方案2】:

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

当导航栏滚出屏幕时,会产生一种错觉,即导航栏是 UIWebView 的一部分。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 2014-09-13
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多