如何在UIWebView下方添加控件

8
什么是最简单、最快或者(客观上)最好的方法来为UIWebView添加一些控件(例如,一些UIButtons)?
要清楚的是,我想显示一个普通的滚动UIWebView,但是当滚动到底部时,我想在网页内容后面添加一些UI控件。我不想通过HTML/CSS模拟看起来像控件的内容来实现;理想情况下,它们应该是真正的控件,我可以像往常一样将其连接到我的视图控制器。
我不知道使用一个包含UIWebView和控件的大型UIScrollView来尝试实现这一点是否最容易(UIScrollView和嵌套的UIWebView之间会有滚动冲突吗?),还是使用一个包含网页视图和控件的UITableView(性能会很差吗?),或者其他我没有想到的方式。
更新:我不认为我想让UIWebView本身实际滚动;我认为我需要调整它的大小以适应所有内容,并完全禁用它的滚动行为,然后允许用户滚动其父视图(即UIScrollView或UITableView)以显示UIWebView的不同部分。

最终我用HTML和CSS来伪造它。-webkit-appearance: push-button可以使其更加美观。使用“一个大的UIWebView”的方法的问题在于视图的最大尺寸为1024x1024像素,因此您不能将整个页面加载到其中一个视图中并将其放入UIScrollView中。应该可以将大页面分成较小的页面,并为每个部分使用单独的UIWebView,但这似乎比屈服于将按钮作为实际页面内容的一部分更糟糕。 - Tom Stuart
3个回答

8
你提出的UIScrollView和UITableView解决方案都不可行。如果将UIWebView放在UIScrollView中,其中一个会拦截滚动并滚动其内容窗格,但另一个则不会。我不确定哪个会,我认为应该是UIScrollView。无论如何,在UIWebView中滚动到底部时,UIScrollView没有提供滚动的选项,反之亦然。如果使用UITableView,UIWebView将在其单元格内滚动,但UITableView根本不会滚动,或者UIWebView根本不会滚动,而UITableView会滚动。如果使用“分组”表样式,则有可能同时滚动UIWebView和UITableView,但这不是您寻找的一致性体验。
我能想到的唯一可行的技术是在UIWebView的内部进行操作,并将包含按钮等内容的UIView添加到UIWebView使用的滚动实体中。这超出了我的理解范围,但这些标题转储将使您入门。请记住,如果苹果公司注意到您正在做什么,他们可能会拒绝您的应用程序,并且内部可能随时更改,破坏您的代码。如果您选择这条路,请尝试以一种使缺少功能导致优雅失败的方式编写代码。

编辑:

经过一些讨论和实验,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的不同部分(最终显现其中的控件)。这是不可行的吗? - Tom Stuart
实际上这是可以实现的。您需要加载请求(使用scalesPageToFit=NO),以某种方式找出页面的高度,并重新调整所有内容以适应您自己UIScrollView的内容。我看到的唯一问题是找出页面的实际高度。这本身可能需要在内部进行操作;UIWebView知道其内容视图的高度,但我不确定是否有简单的方法让它告诉您。我正在尝试一些测试代码,稍后会告诉您结果。 - Alice Isabelle
太棒了。再次感谢。[webView sizeThatFits:CGSizeZero]不能解决问题吗?(http://www.iphonedevsdk.com/forum/iphone-sdk-development/1388-getting-actual-content-size-uiwebview.html) - Tom Stuart
我不知道为什么你问我问题,你比我更擅长这个 :)确实可以工作。我还发现直接向webview的文档视图(在转储的标头中称为)添加东西非常微不足道。我正在编辑答案以包括此的代码示例。 - Alice Isabelle
谢谢。我不想做任何不光彩的事情,可能会导致应用商店拒绝--您能否展示一下使用UIScrollView的正当技术的代码示例? - Tom Stuart
1
我在使用UIScrollView时没有让它正常工作,因为我一直专注于查找大小,没有意识到可以使用sizeThatFits来获取它。当我注意到这一点时,我发现可以直接将其添加到文档视图中,并决定尝试一下。然而,出于你提到的原因,我不建议你这样做。调整滚动视图代码应该相当简单,但如果需要帮助,我可以提供帮助。 - Alice Isabelle

1

我不相信在公共SDK的限制下有任何方法可以做到这一点。


哦,亲爱的。大的UIScrollView和UITableView都不行吗?为什么呢? - Tom Stuart

0

这是我做的方式。

- (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)];
    }


}

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接