【问题标题】:iphone: View on top of UIWebView?iphone:在 UIWebView 上查看?
【发布时间】:2011-07-02 13:36:14
【问题描述】:

我正在开发一个浏览器应用程序,我在 UIWebView 顶部有一个地址栏。在 MobileSafari 上,如果您向下滚动,地址栏会开始移动到顶部,移出屏幕,并且 UIWebView 不会滚动。只有当地址栏完全消失时,它才会开始滚动。我也想在我的应用中使用这种效果。

实现这一点的最佳方法是什么?

谢谢

【问题讨论】:

  • 我可以发誓他们都在 UIScrollView...
  • 但是把UIWebView放在一个scrollView里面可能会打乱WebView的滚动?
  • 我假设您设置了滚动视图的 contentSize,然后滚动视图就是移动的东西。 webview 理论上设置为页面大小。
  • @AurumAquila 使用 iOS5 很容易,请参阅下面的答案;-)

标签: iphone ipad uiwebview uiscrollview


【解决方案1】:

实现这一点的唯一方法需要 iOS 5。 在 iOS 5 中,UIWebView 有一个 UIScrollView 子视图。

并使用以下代码:

为地址栏设置一个区域:

[[myWebView scrollView] setContentInset:UIEdgeInsetsMake(64, 0, 0, 0)];

使用滚动视图代理移动地址栏:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{

        if(scrollView.contentOffset.y>=-64&&scrollView.contentOffset.y<30)
        {
            topBar.frame=CGRectMake(0,-44-scrollView.contentOffset.y, 320, 44);

        }
        else if(scrollView.contentOffset.y<-64)
            topBar.frame=CGRectMake(0,20, 320, 44);//Lock the position
}

【讨论】:

  • 谢谢,这真的解决了我的问题。您也可以通过 for (UIView *view in [webView subviews]){ if ([view isKindOfClass:[UIScrollView class]]){ UIScrollView *theScrollView = (UIScrollView *)view;返回滚动视图;您还需要将顶部 Bar 作为子视图添加到 UIWebView
  • @PeakJi 终于找到了一个适用于此的答案!我花了很长时间才找到它。谢谢!
  • 我在 iOS 6 中这样做了,但我看到的一个问题是,当网页加载或其他内容时,webview 的顶部会自动位于状态栏或手机顶部,有没有修复方法,使其改为导航栏?
  • @MaxHasADHD 很抱歉我的回复太迟了...是的,UIWebview 在“didFinishLoading”上重置其内容偏移量。也许我们可以尝试一些“生涩”的方法来做到这一点(我不知道这些是否有效):使用计时器“锁定”偏移量;湾。延迟“didFinishLoading”后重置偏移量; c.暂时移除内容插图。试一试;-P
  • 我遇到了一个问题,在将子视图添加到 webview 的滚动视图后,一半的网页将无法点击,我通过在位置 0 处插入子视图来修复它(因此它位于视图层次结构的后面),不知道为什么它有效,但确实有效。
【解决方案2】:

有一种方法,但我不确定它是否有点太 hacky。首先在 webview 中搜索滚动视图,然后更改 contentInset,最后将搜索栏(例如)添加到滚动视图。以下代码只是一个示例,我没有正确设置任何框架,40 只是搜索栏的一个组成高度。我不确定这是否适用于每个 iOS 版本。

UIWebView * myWebView = [[UIWebView alloc] init]
UISearchBar * mySearchBar = [[UISearchBar alloc] init];
for (NSObject * aSubView in [myWebView subviews]) {
   if ([aSubView isKindOfClass:[UIScrollView class]]) {
      UIScrollView * theScrollView = (UIScrollView *)aSubView;
      theScrollView.contentInset = UIEdgeInsetsMake(40, 0, 0, 0);
      [theScrollView addSubview:mySearchBar];
   }
}

【讨论】:

  • 我在 4.2 上试过这个,它可以工作。 webview 是否包含“Scroller”类?
  • 4.3 仍然有一个 UIScrollView 子视图。除非 Apple 故意用不同的名称创建一个功能相似的类,否则我怀疑他们会改变这一点。
【解决方案3】:

PeakJi 的解决方案有效,但有点滞后。更好的解决方案是将观察者添加到 UIScrollView 的内容偏移量,例如

[scrollview addObserver:self forKeyPath:@"contentOffset" 
                                    options:NSKeyValueObservingOptionNew context:nil];

您可以在

找到更多关于 NSKeyValueObserving 协议的文档

https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Protocols/NSKeyValueObserving_Protocol/Reference/Reference.html

【讨论】:

    【解决方案4】:

    想一想,它只是一个滚动视图,顶部有一个地址栏,而 Web 视图和地址栏总是一起移动。现在,假设您创建了一个滚动视图并添加了两个子视图,地址栏和 Web 视图(一个在另一个下方)。需要注意的是,网页视图的高度是在页面加载后确定并固定的(在webViewDidFinishLoad:中)。

    因此,它只是一个滚动视图,其 contentSize 等于栏的高度 + Web 视图的高度。现在,默认情况下,Web 视图允许滚动,因为它有一个滚动视图作为子视图。由于只有外部滚动视图应该滚动,因此需要关闭 Web 视图的滚动。为此,获取第一个子视图(即滚动视图)并使用以下方法禁用其滚动:

    (UIScrollView*)[myWebView.subviews objectAtIndex:0].scrollEnabled = NO;
    

    【讨论】:

    • 这个效果你真的实现了吗?顺便说一句,当滚动条仅出现在 UIWebView 中时,地址栏如何包含在 UIScrollView 中?
    • 不,我自己还没有实现。另外,对您而言,准确模拟 Safari 用户界面很重要吗?我提到的在功能上是相同的。重要的是地址栏应该从屏幕上滚出而不占用永久空间,以便为网页提供更多空间。
    • 这个问题已经在我的脑海中萦绕了一段时间。 appstore 上还有其他应用程序(如下载 lite)完全模拟了这种行为......所以我只是想知道如何实现它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多