如何在 UIWebView 下添加控件

Posted

技术标签:

【中文标题】如何在 UIWebView 下添加控件【英文标题】:How to add controls beneath a UIWebView 【发布时间】:2009-07-25 08:39:23 【问题描述】:

在 UIWebView 下添加几个控件(例如一些 UIButton)的最简单、最快或其他(客观上)最好的方法是什么?

明确地说,我想显示一个常规滚动的 UIWebView,但是当滚动到底部时,我希望在 web 内容之后有一些 UIControls。我宁愿不要用看起来像控件的 html/CSS 内容来伪造它;理想情况下,它们应该是真正的控件,我可以像往常一样连接到我的视图控制器。

我不知道是用一个同时包含 UIWebView 和控件的大 UIScrollView(UIScrollView 和嵌套的 UIWebView 之间是否会出现滚动冲突?),还是使用包含 web 的 UITableView在单独的单元格中查看和控制(性能会很糟糕吗?),或者以我没有想到的其他方式。

更新:我不认为我希望 UIWebView 本身真正滚动;我认为我需要调整它的大小以适应其所有内容,完全禁用其滚动行为,然后允许用户滚动其父视图(UIScrollView 或 UITableView)以显示 UIWebView 的不同部分。

【问题讨论】:

我最终用 HTML 和 CSS 伪造了它。 -webkit-appearance:按钮使这更可口。 “一个大的 UIWebView”方法的问题是视图的最大尺寸为 1024x1024 像素,因此您不一定将整个页面加载到一个页面中并将其粘贴在 UIScrollView 中。应该可以将大页面分割成更小的页面,并为每个部分使用单独的 UIWebView,但这似乎比仅仅让按钮成为实际页面内容的一部分更糟糕。 【参考方案1】:

您提出的 UIScrollView 和 UITableView 解决方案都不起作用。

如果将 UIWebView 放在 UIScrollView 中,其中一个会拦截滚动并滚动其内容窗格,但另一个不会。我不确定哪个会,我认为它会是 UIScrollView。在任何情况下,当您在 UIWebView 中滚动结束时,都没有规定 UIScrollView 滚动,反之亦然。

如果您使用 UITableView,UIWebView 将在其单元格内滚动,但 UITableView 根本不会滚动,或者 UIWebView 根本不会滚动,而 UITableView 会。如果您使用“分组”表格样式,您可能会滚动 UIWebView 和 UITableView,但这不会是您正在寻找的那种有凝聚力的体验。

我能想到的唯一可行的技术是在 UIWebView 的内部进行处理,并将包含按钮的 UIView 添加到 UIWebView 使用的滚动实体中。这超出了我的理解,但是these header dumps will get you started. 请记住,如果 Apple 注意到您在做什么,他们可能会拒绝您的应用程序,此外,内部结构可能随时更改,从而破坏您的代码。如果您走这条路,请尝试以这样一种方式对其进行编码,即缺少功能会导致正常失败。

编辑:

经过一些讨论和试验,我和 OP 得出的​​结论是,这是很有可能的,并且有一种完全不依赖内部机制的方法来做到这一点。也就是说,使用封闭的滚动视图,并在 Web 视图加载到其自己的内容视图的完整大小后调整其大小。可以使用 [webView sizeThatFits:CGSizeZero] 找到此大小。

如果您确实想使用 UIWebView 的私有信息来完成此操作,我有一个简短的代码示例,用于向 UIWebView 的文档视图添加视图,因为无论如何我都解决了 :)

- (void)applicationDidFinishLaunching:(UIApplication *)application     

    // Override point for customization after app launch 
    UIView* testView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)] autorelease];
    UIWebView* testWebView = [[[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)] autorelease];
    [testView addSubview:testWebView];
    [testWebView setDelegate:self];
    [testWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]]];



    [window addSubview:testView];
    [window makeKeyAndVisible];

- (void)webViewDidFinishLoad:(UIWebView *)webView 
    UIView *insert = [[[UIView alloc] initWithFrame:CGRectMake(0, [[webView _documentView] frame].size.height, 320, 40)] autorelease];
    [insert setBackgroundColor:[UIColor greenColor]];
    [[webView _documentView] addSubview:insert];

【讨论】:

感谢您全面周到的回答。不过,我根本不希望 UIWebView 本身滚动:我想将其调整为足够大以显示其所有内容(即几个屏幕高),并且只需滚动父视图以显示大视图的不同部分UIWebView(以及它下面的控件)。这不是可以实现的吗? 其实这可能是可以实现的。您必须加载请求(使用 scalesPageToFit=NO),以某种方式找出页面的高度,然后在您自己的 UIScrollView 的内容中重新构建所有内容以适应该请求。我看到的唯一问题是找出页面实际有多高。这本身可能需要在内部进行处理; UIWebView 知道如何告诉它的内容视图,但我不确定是否有一种简单的方法可以让它告诉你。我现在正在修改一些测试代码,我会告诉你它是怎么回事。 太棒了。再次感谢。 [webView sizeThatFits:CGSizeZero] 不能解决问题吗? (iphonedevsdk.com/forum/iphone-sdk-development/…) 我不知道你为什么要问我问题,你比我有更好的处理能力:) 这确实有效。我还发现,将内容直接添加到 webview 的文档视图(正如在转储的标题中所引用的那样)是完全微不足道的。我正在编辑答案以包含此代码示例。 我没有让它与 UIScrollView 一起使用,因为我专注于寻找尺寸,没有意识到你可以使用 sizeThatFits 来获得它。当我这样做时,我注意到您可以直接将其添加到文档视图中,因此我决定尝试一下。但是,出于您提到的原因,这不是我建议您这样做的方式。编写滚动视图代码应该相当简单,但如果您需要,我可以提供帮助。【参考方案2】:

我认为在公共 SDK 的限制下没有任何方法可以做到这一点。

【讨论】:

天哪。大 UIScrollView 和 UITableView 都不起作用吗?为什么不呢?【参考方案3】:

我就是这样做的。

- (void)webViewDidFinishLoad:(UIWebView *)webView 


for(UIView *view in [webView subviews])

    if([view isKindOfClass:[UIScrollView class]])
        NSLog(@"Scrollview found with tag %d", [view tag]);

        UIScrollView *scroll= (UIScrollView *)view;
        [scroll addSubview:self.finishBtn];
        [finishBtn setCenter:CGPointMake(webView.center.x, scroll.contentSize.height-30)];
    



【讨论】:

以上是关于如何在 UIWebView 下添加控件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 `UIWebView` 控件中使用`UIKeyInput` 协议?

如何自定义 UIWebView 的 MoviePlayer

如何在 UIWebview 上添加 UISwipeGestureRecognizer

如何在没有 UIWebView 的情况下播放 youtube 视频或在 youtube 视频开始使用 webview 播放时检测视频播放器?

如何使用 Safari 应用程序在 UIWebView 中启动链接?

如何将项目添加到 UIWebView 的 UIScrollView