2011-03-16 55 views
3

我的設置:
我在我的iPhone應用程序中有一個webview,去www.mysite.com。在UIWebview上顯示本地UIImage

試驗
如果我設置「的backgroundColor的UIColor clearcolor」我的web視圖並繪製的UIImage我的WebView的背後,也不會與我的WebView滾動!

我的問題:
我想用webview的圖像。此外,這個圖像應該存儲在iPhone應用程序中,而不是在網絡服務器上(當然,如果我把圖像放在網絡服務器上,我可以簡單地用CSS作爲背景)。

什麼是通過html/javascript/Objective C訪問這個圖像的最佳方式,所以我可以看到這個本地圖像作爲我的網站的背景?有沒有辦法?

+0

此鏈接包含簡單的答案[使用-HTML和本地-images中之的UIWebView] [1] [1]:http://stackoverflow.com/questi ons/747407/using-html-and-local-images-within-uiwebview – 2012-02-10 10:57:10

回答

8

您有幾個選項。你可以用

[[NSBundle mainBundle] bundleURL] 

一個基本URL加載頁面,或者您可以使用JavaScript使用下面的方法來設置路徑到您的圖像。

[[NSBundle mainBundle] URLForResource:@"myimage" withExtension:@"png"] 

編輯:這裏檢查Link to resources inside WebView - iPhone。它看起來像你將使用pathForResource而不是URLForResource。

編輯2:您可能想要使用數據URI來將自己的本地文件添加到網站。

YourCode.m

#import "NSString+DataURI.h" 
#import "NSData+Base64.h" 
... 

-(void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    NSString *imgPath = [[NSBundle mainBundle] pathForResource:@"image" ofType:@"png"]; 
    NSData *imgData = [NSData dataWithContentsOfFile:imgPath]; 
    NSString *imgB64 = [[imgData base64Encoding] pngDataURIWithContent]; 

    NSString *javascript = [NSString stringWithFormat:@"document.body.style.backgroundImage='url(%@)';", imgB64]; 
    [webView stringByEvaluatingJavaScriptFromString:javascript]; 
} 

下面的代碼不是我寫的,我不知道起源

的NSData + Base64.h

@interface NSData (Base64) 

+ (NSData *)dataWithBase64EncodedString:(NSString *)string; 
- (id)initWithBase64EncodedString:(NSString *)string; 

- (NSString *)base64Encoding; 
- (NSString *)base64EncodingWithLineLength:(unsigned int) lineLength; 

@end 

NSData.Base64.m的

#import "NSData+Base64.h" 

static char encodingTable[64] = { 
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P', 
'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f', 
'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v', 
'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/' }; 

@implementation NSData (VQBase64) 

- (id)initWithString:(NSString *)string { 
    if ((self = [super init])) { 
     [self initWithBase64EncodedString:string]; 
    } 
    return self; 

} 


+ (NSData *) dataWithBase64EncodedString:(NSString *) string { 
    return [[[NSData allocWithZone:nil] initWithBase64EncodedString:string] autorelease]; 
} 

- (id) initWithBase64EncodedString:(NSString *) string { 
    NSMutableData *mutableData = nil; 

    if(string) { 
     unsigned long ixtext = 0; 
     unsigned long lentext = 0; 
     unsigned char ch = 0; 
     unsigned char inbuf[4], outbuf[3]; 
     short i = 0, ixinbuf = 0; 
     BOOL flignore = NO; 
     BOOL flendtext = NO; 
     NSData *base64Data = nil; 
     const unsigned char *base64Bytes = nil; 

     // Convert the string to ASCII data. 
     base64Data = [string dataUsingEncoding:NSASCIIStringEncoding]; 
     base64Bytes = [base64Data bytes]; 
     mutableData = [NSMutableData dataWithCapacity:[base64Data length]]; 
     lentext = [base64Data length]; 

     while(YES) { 
      if(ixtext >= lentext) break; 
      ch = base64Bytes[ixtext++]; 
      flignore = NO; 

      if((ch >= 'A') && (ch <= 'Z')) ch = ch - 'A'; 
      else if((ch >= 'a') && (ch <= 'z')) ch = ch - 'a' + 26; 
      else if((ch >= '0') && (ch <= '9')) ch = ch - '0' + 52; 
      else if(ch == '+') ch = 62; 
      else if(ch == '=') flendtext = YES; 
      else if(ch == '/') ch = 63; 
      else flignore = YES; 

      if(! flignore) { 
       short ctcharsinbuf = 3; 
       BOOL flbreak = NO; 

       if(flendtext) { 
        if(! ixinbuf) break; 
        if((ixinbuf == 1) || (ixinbuf == 2)) ctcharsinbuf = 1; 
        else ctcharsinbuf = 2; 
        ixinbuf = 3; 
        flbreak = YES; 
       } 

       inbuf [ixinbuf++] = ch; 

       if(ixinbuf == 4) { 
        ixinbuf = 0; 
        outbuf [0] = (inbuf[0] << 2) | ((inbuf[1] & 0x30) >> 4); 
        outbuf [1] = ((inbuf[1] & 0x0F) << 4) | ((inbuf[2] & 0x3C) >> 2); 
        outbuf [2] = ((inbuf[2] & 0x03) << 6) | (inbuf[3] & 0x3F); 

        for(i = 0; i < ctcharsinbuf; i++) 
         [mutableData appendBytes:&outbuf[i] length:1]; 
       } 

       if(flbreak) break; 
      } 
     } 
    } 

    self = [self initWithData:mutableData]; 
    return self; 
} 

#pragma mark - 

- (NSString *) base64Encoding { 
    return [self base64EncodingWithLineLength:0]; 
} 

- (NSString *) base64EncodingWithLineLength:(unsigned int) lineLength { 
    const unsigned char  *bytes = [self bytes]; 
    NSMutableString *result = [NSMutableString stringWithCapacity:[self length]]; 
    unsigned long ixtext = 0; 
    unsigned long lentext = [self length]; 
    long ctremaining = 0; 
    unsigned char inbuf[3], outbuf[4]; 
    unsigned short i = 0; 
    unsigned short charsonline = 0, ctcopy = 0; 
    unsigned long ix = 0; 

    while(YES) { 
     ctremaining = lentext - ixtext; 
     if(ctremaining <= 0) break; 

     for(i = 0; i < 3; i++) { 
      ix = ixtext + i; 
      if(ix < lentext) inbuf[i] = bytes[ix]; 
      else inbuf [i] = 0; 
     } 

     outbuf [0] = (inbuf [0] & 0xFC) >> 2; 
     outbuf [1] = ((inbuf [0] & 0x03) << 4) | ((inbuf [1] & 0xF0) >> 4); 
     outbuf [2] = ((inbuf [1] & 0x0F) << 2) | ((inbuf [2] & 0xC0) >> 6); 
     outbuf [3] = inbuf [2] & 0x3F; 
     ctcopy = 4; 

     switch(ctremaining) { 
      case 1: 
       ctcopy = 2; 
       break; 
      case 2: 
       ctcopy = 3; 
       break; 
     } 

     for(i = 0; i < ctcopy; i++) 
      [result appendFormat:@"%c", encodingTable[outbuf[i]]]; 

     for(i = ctcopy; i < 4; i++) 
      [result appendString:@"="]; 

     ixtext += 3; 
     charsonline += 4; 

     if(lineLength > 0) { 
      if(charsonline >= lineLength) { 
       charsonline = 0; 
       [result appendString:@"\n"]; 
      } 
     } 
    } 

    return [NSString stringWithString:result]; 
} 

@end 

的NSString + DataURI.h

#import <Foundation/Foundation.h> 

@interface NSString(DataURI) 
- (NSString *) pngDataURIWithContent; 
- (NSString *) jpgDataURIWithContent; 
@end 

的NSString + DataURI.m

#import "NSString+DataURI.h" 


@implementation NSString(DataURI) 

- (NSString *) pngDataURIWithContent; 
{ 
    NSString * result = [NSString stringWithFormat: @"data:image/png;base64,%@", self]; 
    return result; 
} 

- (NSString *) jpgDataURIWithContent; 
{ 
    NSString * result = [NSString stringWithFormat: @"data:image/jpg;base64,%@", self]; 
    return result; 
} 

@end 
+0

我嘗試了JavaScript注入,加載此javascript字符串:[NSString stringWithFormat:@「document.body.style。如下所示:webview加載一個外部頁面並顯示本地背景,即使背景圖像的URL是正確的(檢查與日誌記錄),這根本不工作?任何想法? – andreas 2011-03-17 00:40:23

+0

我使用baseURL選項與我的代碼。你有沒有按照我提供的鏈接我的編輯? – Joe 2011-03-17 12:52:20

+0

是的,謝謝!但在他們的例子中,他們討論的是包含本地html文件而不是外部文件,那麼如何以及在哪裏設置bundleURL呢?也許我錯過了一些東西,但我不明白如何使它適用於外部文件。 – andreas 2011-03-17 13:29:01

0

你可以簡單地加入這一行

webView.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"light.jpg"]];