2011-12-12 25 views

回答

6

Web视图可用于制作MS文档预览。

我已经试过一次这样做了这段代码。 它的工作原理...但是...网络视图需要在图形线程中工作,所以当这个操作运行时,你的接口速度较慢。也许你可以优化它。

页眉

@interface WebViewThumbnailGenerationOperation: NSOperation <UIWebViewDelegate> { 
    BOOL finished; 
} 
@property(nonatomic,retain) NSURL* documentURL; 
@property(nonatomic,retain) UIWebView* webView; 

-(void)saveThumbnail:(UIImage*)thumbnail; 

@end 

代码

/**************************************************************************************************/ 
#pragma mark - WebViewBased Thumbnails 

@implementation WebViewThumbnailGenerationOperation 

@synthesize documentURL,webView; 

-(void)dealloc { 
    RELEASE_SAFELY(documentURL); 
    [super dealloc]; 
} 


- (void)loadWebView { 
    if (self.isCancelled) { 
     return; 
    } 
    self.webView = [[[UIWebView alloc] init] autorelease]; 
    self.webView.delegate = self; 
    self.webView.scalesPageToFit = YES; 
    self.webView.frame = CGRectMake(0, 0, 290, 290); 
    NSURLRequest *request = [NSURLRequest requestWithURL:documentURL]; 
    [self.webView loadRequest:request];  
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    if (self.isCancelled) { 
     return; 
    } 
    UIGraphicsBeginImageContext(CGSizeMake(290,290)); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    [self.webView.layer renderInContext:context]; 
    UIImage *thumbnail = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    [self performSelectorInBackground:@selector(saveThumbnail:) withObject:thumbnail]; 

    self.webView = nil; 
} 

-(void)saveThumbnail:(UIImage*)thumbnail { 
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
    if (self.isCancelled) { 
     return; 
    } 

    if(!thumbnail) { 
     return; 
    } 

    NSData* thumbnailData = UIImageJPEGRepresentation(thumbnail,0.8); 
    [IOHelper saveThumbnailData:thumbnailData forDocumentURL:documentURL]; 

    [self willChangeValueForKey:@"isFinished"]; 
    finished = YES; 
    [self didChangeValueForKey:@"isFinished"]; 

    [pool release]; 
} 

-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { 
    NSLog(@"Preview failed for %@ error %@",document.name,error); 
    [self willChangeValueForKey:@"isFinished"]; 
    finished = YES; 
    [self didChangeValueForKey:@"isFinished"]; 
    self.webView = nil; 
} 

-(void)start { 
    finished = NO; 
    [super start]; 
} 

- (void)main { 
    if (self.isCancelled) { 
     return; 
    } 
    [self performSelectorOnMainThread:@selector(loadWebView) withObject:nil waitUntilDone:YES]; 
} 

-(BOOL)isFinished { 
    return finished; 
} 

@end 

编辑: ARC版!

部首

​​

代码

/**************************************************************************************************/ 
#pragma mark - WebViewBased Thumbnails 

@implementation WebViewThumbnailGenerationOperation 

- (void)loadWebView { 
    if (self.isCancelled) { 
     return; 
    } 
    self.webView = [[UIWebView alloc] init]; 
    self.webView.delegate = self; 
    self.webView.scalesPageToFit = YES; 
    self.webView.frame = CGRectMake(0, 0, 290, 290); 
    NSURLRequest *request = [NSURLRequest requestWithURL:documentURL]; 
    [self.webView loadRequest:request];  
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    if (self.isCancelled) { 
     return; 
    } 
    UIGraphicsBeginImageContext(CGSizeMake(290,290)); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    [self.webView.layer renderInContext:context]; 
    UIImage *thumbnail = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    [self performSelectorInBackground:@selector(saveThumbnail:) withObject:thumbnail]; 

    self.webView = nil; 
} 

-(void)saveThumbnail:(UIImage*)thumbnail { 
    @autoreleasepool { 
     if (self.isCancelled) { 
      return; 
     } 

     if(!thumbnail) { 
      return; 
     } 

     NSData* thumbnailData = UIImageJPEGRepresentation(thumbnail,0.8); 
     [IOHelper saveThumbnailData:thumbnailData forDocumentURL:documentURL]; 

     [self willChangeValueForKey:@"isFinished"]; 
     finished = YES; 
     [self didChangeValueForKey:@"isFinished"]; 

    } 
} 

-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { 
    NSLog(@"Preview failed for %@ error %@", document.name, error); 
    [self willChangeValueForKey:@"isFinished"]; 
    finished = YES; 
    [self didChangeValueForKey:@"isFinished"]; 
    self.webView = nil; 
} 

-(void)start { 
    finished = NO; 
    [super start]; 
} 

- (void)main { 
    if (self.isCancelled) { 
     return; 
    } 
    [self performSelectorOnMainThread:@selector(loadWebView) withObject:nil waitUntilDone:YES]; 
} 

-(BOOL)isFinished { 
    return finished; 
} 

@end