UIWebView截图

时间:2013-07-02 11:27:37

标签: ios uiwebview screenshot

我在尝试截取UIWebViews屏幕截图时遇到问题。我需要拍摄UIWebView的一些屏幕截图并且它有效,但屏幕截图不正确,因为它们是在事件webViewDidFinishLoad中拍摄的,但在webViewDidFinishLoad时调用UIWebView没有完全加载,我的意思是,我在事件webViewDidFinishLoad中截取屏幕截图,但UIWebView未正确且完全加载,因此它需要截图并且它正确但屏幕截图不完全正确,因为事件被触发(webViewDidFinishLoad),但UIWebView未完全加载。有什么想法吗?

非常感谢

2 个答案:

答案 0 :(得分:0)

您可以尝试使用UIButton显式获取屏幕截图,而不是在事件webViewDidFinishLoad中截取屏幕截图。让此按钮被禁用,您可以在Web视图完全加载其内容后将此按钮的enabled属性设置为YES。 单击按钮可以实现代码以截取屏幕截图。

已编辑:Webview的webViewDidFinishLoad方法在完成加载其内容时被调用。可能需要花一些时间在其视图上呈现一些图像/内容。 如果可能,您可以在webViewDidFinishLoad方法中使用NSTimer等待足够的时间(1分钟),以便在webview完全加载其内容时表示。

NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:60.0                                              目标:自我                                            selector:@selector(MethodName :)                                            userInfo:无                                             重复:没有];

在选择器方法中,您可以实现截屏的代码。

希望这会对你有帮助......

答案 1 :(得分:0)

用户在使用活动指示符时遇到问题,直到页面已加载但是在主要内容加载后他们会回来问题是UIWebView not finishing loading?并且下面使用了答案代码。在代码之后,我将详细介绍如何将其用于您的情况。

(在下面的代码中,网页真正开始加载//show UIActivityIndicator并真正完成加载//hide UIActivityIndicator上的主要内容(而不是您正在努力争取的额外内容)

//Define the NSStrings "lastURL" & "currentURL" in the .h file.
//Define the int "falsepositive" in the .h file. (You could use booleans if you want)
//Define your UIWebView's delegate (either in the xib file or in your code)

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    lastURL = [[NSString alloc] initWithFormat:@"%@", webView.request.mainDocumentURL];
    if (falsepositive != 1) {
        NSLog(@"Loaded");
        //hide UIActivityIndicator
    } else {
        NSLog(@"Extra content junk (i.e. advertisements) that the page loaded with javascript has finished loading");
        //This method may be a good way to prevent ads from loading hehe, but we won't do that
    }
}

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; {
    NSURL *requestURL =[request mainDocumentURL];
    currentURL = [[NSString alloc] initWithFormat:@"%@", requestURL]; //not sure if "%@" should be used for an NSURL but it worked...
    return YES;
}

- (void)webViewDidStartLoad:(UIWebView *)webView {
    if ([currentURL isEqualToString:lastURL]) {
        falsepositive = 1;
        NSLog(@"The page is loading extra content with javascript or something, ignore this");
    } else {
        falsepositive = 0;
        NSLog(@"Loading");
        //show UIActiviyIndicator
    }
}

当在iOS中加载页面时,会调用webviewdidstart和webviewdidfinish,但不知道主页面/ html内容中的差异Objective-c会再次调用此内容以获取额外内容,例如广告或框架。如果我在你的情况下使用这个,我会创建一个BOOL,例如pageIsLoading,并在webviewdidstart中将其设置为true,然后在webviewdidfinish中将其设置为false。在webviewdidfinish中关闭BOOL后,我会通过调用一个方法来结束webviewdidfinish,如果BOOL pageIsLoading == YES,则会在短暂的延迟后检查,如果是,则不执行任何操作,因为正在加载更多内容。如果pageIsloading == no,则必须加载所有内容,现在是拍摄快照的好时机。