8

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

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

我不知道尝试使用一个包含 UIWebView 和控件的大 UIScrollView 是否最简单(UIScrollView 和嵌套的 UIWebView 之间会存在滚动冲突吗?),还是使用包含 Web 视图和控件的 UITableView在单独的单元格中(性能会很糟糕吗?),或者以我没有想到的其他方式。

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

4

3 回答 3

8

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

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

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

我能想到的唯一可行的技术是在 UIWebView 的内部进行处理,并将包含按钮的 UIView 添加到 UIWebView 使用的滚动实体中。这超出了我的理解,但是这些标头转储将帮助您入门。请记住,如果 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];
}
于 2009-07-25T09:03:51.577 回答
1

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

于 2009-07-25T08:45:30.210 回答
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)];
    }


}

}

于 2012-06-29T07:55:53.893 回答