wake-up-neo.com

Verwenden von HTML und lokalen Bildern in UIWebView

Ich habe ein UIWebView in meiner App, mit dem ich ein Bild anzeigen möchte, das auf eine andere URL verweist.

Ich benutze

<img src="image.jpg" /> to load the image.

Das Problem ist, dass das Image nicht geladen wird (dh nicht gefunden wird), obwohl es als Ressource in meinem Projekt hinzugefügt und in das Bundle kopiert wird.

Ich habe versucht, NSBundle zu verwenden, um den vollständigen Pfad des Bildes abzurufen, und dies zu verwenden, und es wird immer noch nicht in der Webansicht angezeigt.

Irgendwelche Ideen?

160
Jasarien

Relative Pfade oder Datei: Pfade zum Verweisen auf Bilder funktionieren in UIWebView nicht. Stattdessen müssen Sie den HTML-Code mit der richtigen baseURL in die Ansicht laden:

NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];
[webView loadHTMLString:htmlString baseURL:baseURL];

Sie können dann wie folgt auf Ihre Bilder verweisen:

<img src="myimage.png">

(von iwebview überarbeitet )

289
Adam Alexander

Benutze das:

[webView loadHTMLString:htmlString baseURL:[[NSBundle mainBundle] bundleURL]];
46
Lithu T.V

Ich bin auch auf dieses Problem gestoßen. In meinem Fall handelte es sich um einige Bilder, die nicht lokalisiert waren, und andere, die - in mehreren Sprachen - waren. Über eine Basis-URL wurden die Bilder nicht in lokalisierten Ordnern gespeichert. Ich habe das folgendermaßen gelöst:

// make sure you have the image name and extension (for demo purposes, I'm using "myImage" and "png" for the file "myImage.png", which may or may not be localized)
NSString *imageFileName = @"myImage";
NSString *imageFileExtension = @"png";

// load the path of the image in the main bundle (this gets the full local path to the image you need, including if it is localized and if you have a @2x version)
NSString *imagePath = [[NSBundle mainBundle] pathForResource:imageFileName ofType:imageFileExtension];

// generate the html tag for the image (don't forget to use file:// for local paths)
NSString *imgHTMLTag = [NSString stringWithFormat:@"<img src=\"file://%@\" />", imagePath];

Verwenden Sie dann imgHTMLTag in Ihrem UIWebView-HTML-Code, wenn Sie den Inhalt laden.

Ich hoffe das hilft jedem, der auf das gleiche Problem gestoßen ist.

24
Anton

Ich hatte ein ähnliches Problem, aber alle Vorschläge haben nicht geholfen.

Das Problem war jedoch die * .png selbst. Es hatte keinen Alphakanal. Irgendwie Xcode ignoriert alle PNG-Dateien ohne Alphakanal während des Bereitstellungsprozesses.

6
user289841

versuchen Sie, eine Base64-Bildzeichenfolge zu verwenden.

NSData* data = UIImageJPEGRepresentation(image, 1.0f);

NSString *strEncoded = [data base64Encoding];   

<img src='data:image/png;base64,%@ '/>,strEncoded
6
Ping

Sie können Ihrem Projekt Ordner hinzufügen (z. B. WEB mit den Unterordnern css, img und js und file test.html), indem Sie Add Files to "MyProj" wählen und auswählen Ordnerreferenzen erstellen . Der folgende Code kümmert sich nun um alle verwiesenen Bilder, CSS und Javascript

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"WEB/test.html" ofType:nil];
[webView  loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:filePath]]];
3
zeeawan

In Swift 3:

webView.loadHTMLString("<img src=\"myImg.jpg\">", baseURL: Bundle.main.bundleURL)

Dies funktionierte auch dann für mich, wenn sich das Bild ohne Änderungen in einem Ordner befand.

3
MrAn3

Nachdem ich ein paar Kapitel in iOS 6 Programming Cookbok gelesen und angefangen habe, Objective-C- und iOS-Programmierung zu lernen, möchte ich nur hinzufügen, dass, wenn man Ressourcen aus einem benutzerdefinierten -Paket laden möchte und verwenden Sie das in einer Web-Ansicht, es kann wie folgt durchgeführt werden:

NSString *resourcesBundlePath = [[NSBundle mainBundle] pathForResource:@"Resources" ofType:@"bundle"];
NSBundle *resourcesBundle = [NSBundle bundleWithPath:resourcesBundlePath];
[self.outletWebView loadHTMLString:[html description] baseURL:[resourcesBundle bundleURL]];

Dann können Sie in Ihrem HTML-Code auf eine Ressource verweisen, indem Sie das "benutzerdefinierte" Bundle als Basispfad verwenden:

body {
    background-image:url('img/myBg.png');
}
2

Schnelle Version der Antwort von Lithu T.V.

webView.loadHTMLString(htmlString, baseURL: NSBundle.mainBundle().bundleURL)
1
Musa almatri

Schnelle Version von Adam Alexanders Ziel C Antwort:

let logoImageURL = NSURL(fileURLWithPath: "\(Bundle.main.bundlePath)/PDF_HeaderImage.png")
1
RJH

Wenn Sie relative Links zu Bildern verwenden, werden die Bilder nicht angezeigt, da nach dem Kompilieren der iOS-App nicht alle Ordnerstrukturen beibehalten werden. Sie können Ihr lokales Web Ordner in ein Bundle konvertieren, indem Sie die Dateinamenerweiterung '. Bundle' hinzufügen.

Wenn sich Ihre lokale Website in einem Ordner "www" befindet, sollte dieser in "www.bundle" umbenannt werden. Dadurch können die Bildordner und die Verzeichnisstruktur beibehalten werden. Laden Sie dann die Datei 'index.html' als HTML-String mit 'baseURL' (auf www.bundle path gesetzt) ​​in das WebView, um das Laden relativer Bildverknüpfungen zu ermöglichen.

NSString *mainBundlePath = [[NSBundle mainBundle] resourcePath];
NSString *wwwBundlePath = [mainBundlePath stringByAppendingPathComponent:@"www.bundle"];
NSBundle *wwwBundle = [NSBundle bundleWithPath:wwwBundlePath];
if (wwwBundle != nil) {
    NSURL *baseURL = [NSURL fileURLWithPath:[wwwBundle bundlePath]];
    NSError *error = nil;
    NSString *page = [[NSBundle mainBundle] pathForResource:@"index.html" ofType:nil];
    NSString *pageSource = [NSString stringWithContentsOfFile:page encoding:NSUTF8StringEncoding error:&error];
    [self.webView loadHTMLString:pageSource baseURL:baseURL];
}
0
David Douglas

Diese Antworten haben mir geholfen - insbesondere die Datei: \\ xxxxxxx.xxx, aber ich musste eine Problemumgehung durchführen, um das Bild anzuzeigen.

In meinem Fall habe ich eine HTML-Datei auf meinem Server, die ich in das Dokumentenverzeichnis herunterlade. Ich möchte es mit einer lokalen Grafik in einer UIWebView anzeigen, die ich nicht zur Arbeit bekommen konnte. Folgendes habe ich getan:

  1. Kopieren Sie die Datei aus dem NSBundle in das lokale Dokumentenverzeichnis
  2. Verweisen Sie auf die Datei in meinem HTML-Dokument als "file: \\ filename.png"

Kopieren Sie also beim Start die Datei in das Dokumentenverzeichnis:

-(BOOL)copyBundleFilesToDocumentsDirectoryForFileName:(NSString *)fileNameToCopy OverwriteExisting:(BOOL)overwrite {
        //GET DOCUMENTS DIR
        //Search for standard documents using NSSearchPathForDirectoriesInDomains
        //First Param = Searching the documents directory
        //Second Param = Searching the Users directory and not the System
        //Expand any tildes and identify home directories.
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDir = [paths objectAtIndex:0];

        //COPY FILE FROM NSBUNDLE File to Local Documents Dir
        NSString *writableFilePath = [documentsDir  stringByAppendingPathComponent:fileNameToCopy];

        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSError *fileError;

        DDLogVerbose(@"File Copy From Bundle to Documents Dir would go to this path: %@", writableFilePath);

        if ([fileManager fileExistsAtPath:writableFilePath]) {
            DDLogVerbose(@"File %@ already exists in Documents Dir", fileNameToCopy);

            if (overwrite) {
                [fileManager removeItemAtPath:writableFilePath error:nil];
                DDLogVerbose(@"OLD File %@ was Deleted from  Documents Dir Successfully", fileNameToCopy);
            } else {
                return (NO);
            }
        }

        NSArray *fileNameParts = [fileNameToCopy componentsSeparatedByString:@"."];
        NSString *bundlePath = [[NSBundle mainBundle]pathForResource:[fileNameParts objectAtIndex:0] ofType:[fileNameParts objectAtIndex:1]];
        BOOL success = [fileManager copyItemAtPath:bundlePath toPath:writableFilePath error:&fileError];

        if (success) {
            DDLogVerbose(@"Copied %@ from Bundle to Documents Dir Successfully", fileNameToCopy);
        } else {
            DDLogError(@"File %@ could NOT be copied from bundle to Documents Dir due to error %@!!", fileNameToCopy, fileError);
        }

    return (success);
}
0
DoctorG