UIWebView İçinde HTML ve Yerel Görüntüleri Kullanma


164

Başka bir URL'ye bağlanacak bir resmi görüntülemek için kullanmak istediğim uygulamamda bir UIWebView var.

kullanıyorum

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

Sorun, projemde bir kaynak olarak eklenmesine ve pakete kopyalanmasına rağmen görüntünün yüklenmemesi (yani bulunamıyor).

Görüntünün tam yolunu almak için NSBundle kullanarak denedim ve bunu kullanarak ve hala web görünümünde görünmüyor.

Herhangi bir fikir?


Artık iPhone OS 3.0'dan beri bunu yapamıyorum. :( Daha fazla bilgi (StackOverflow.com).
Joe D'Andrea

8
Neden aşağı oy? : /
Jasarien

5
Kötü olmaları şart değildir. Belki de meşru bir nedenleri vardı? Muhtemelen asla bilemeyiz. Keşke bir
oyunda

63
Oy hakkında aşağıya bir yorum yazmak zorunlu olmalıdır.
Robert

@Jasarien: Aynı işlevselliğe ihtiyacım var. ama htmlString içinde [webView loadHTMLString: htmlString baseURL] ve neyi <img src = "image.jpg" /> resmimi html'ye koymam gerektiğini anlayamıyorum.
iPhone

Yanıtlar:


291

Göreli yollar veya dosya: yollara başvurmak görüntüleri UIWebView ile çalışmaz. Bunun yerine HTML'yi görünüme doğru baseURL ile yüklemeniz gerekir:

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

Ardından resimlerinize şu şekilde başvurabilirsiniz:

<img src="myimage.png">

( uiwebview adresinden tekrar ziyaret edildi )


15
[[NSBundle mainBundle] bundleURL] Bunu bundleURL olarak kullanabiliriz
Naveen Shan

2
Tüm bu benim için yapar benim htmlString için tanımladığım benim web görünümünde bir dize vermektir. yani sayfadaki tüm gösterileri "tour.html" dir
Chewie Chorkie

Bir sidenote olarak, javascript dosyalarını resimlerin aksine yüklemeye çalışıyorsanız, buna da bakmanız gerekir: stackoverflow.com/a/3629479/385619
Willster

Xamarin ad MonoTouch webvie.LoadHtmlString (strig, NSBundle.MainBundle.BundleUrl) durumunda;
Erik Simonic

1
Simülatörde mükemmel çalış, ancak cihazımda değil
jose920405

46

Bunu kullan:

[webView loadHTMLString:htmlString baseURL:[[NSBundle mainBundle] bundleURL]];

5
Ancak cevabınız 3 yıl önce gönderilen cevapla aynı ... Cevabınız farklı bir şey sunmuyor, kabul edilmesi gerekmedi çünkü kabul edilen cevap, yayınladığınız şeyi zaten kapsıyor.
Jasarien

13
Kabul edilen cevabın kullanışlı tek satırlık bir versiyonudur - burada bulunarak zarar vermez.
MusiGenesis

9
@Adam Alexander'ın cevabı Ağustos 2009'a kadar tek çözümdü. Ancak Max OS X sürüm bundleURL10.6'dan bu yeni özellik NSBundle'a eklendi. BundlePath alıp URL'ye dönüştürmeye gerek yoktur. Yani 10.6'dan yüksek sürümlerde çalışan insanlar için bu daha iyi bir çözüm sağlar.
rineez

Son zamanlarda bu yazıda çok fazla -ve aktivite görmek .. Ve kimse neden olduğunu kaydetmedi?
Lithu TV

24

Ben de bu problemle karşılaştım. Benim durumumda, yerelleştirilmemiş bazı görüntülerle, birden fazla dilde olan diğer görüntülerle uğraşıyordum. Temel URL resimleri benim için yerelleştirilmiş klasörlere yerleştirmedi. Bunu aşağıdakileri yaparak çözdüm:

// 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];

Ardından, içeriği yüklerken UIWebView HTML kodunuzda imgHTMLTag kullanın.

Umarım bu aynı problemle karşılaşan herkese yardımcı olur.


1
Kullanmak file://ihtiyacım olan şeydi.
So Over It

Güzel, tam olarak ihtiyacım olan şey
Rubberduck

8

base64 resim dizesini kullanmayı deneyin.

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

NSString *strEncoded = [data base64Encoding];   

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

6

Simmilar ile ilgili bir sorunum vardı, ancak tüm öneriler işe yaramadı.

Ancak, sorun * .png'nin kendisiydi. Alfa kanalı yoktu . Her nasılsa Xcode konuşlandırma işlemi sırasında alfa kanalı olmayan tüm png dosyalarını yok sayar .


Bundan kurtulmak için ne yaptın? Herhangi bir çözüm buldunuz mu? Aynı sorunla karşı karşıyayım. UIWebView, Alfa Kanalı olmadığı için görüntüleri göstermiyor.
spaleja

1
PNG dosyalarıma bir alfa kanalı eklemek için Gimp kullandım. Bkz. Docs.gimp.org/tr/gimp-layer-alpha-add.html

3

"MyProj" Dosya Ekle'yi ve Klasör referansları oluştur'u seçerek projenize klasör (css, img ve js alt klasörlerine sahip WEB diyelim ve dosya test.html) ekleyebilirsiniz . Şimdi aşağıdaki kod atıfta bulunulan tüm resimler, css ve javascript ile ilgilenecektir

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

3

Swift 3'te:

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

Bu, görüntü herhangi bir değişiklik yapılmadan bir klasörün içindeyken bile benim için çalıştı.


2

İOS 6 Programlama Cookbok'ta birkaç bölüm okuduktan ve objektif-c ve iOS programlamayı öğrenmeye başladıktan sonra, şunu eklemek isterim, eğer biri özel bir paketten kaynak yükleyecek ve bunu bir web görünümünde kullanacaksa , şu şekilde yapılabilir:

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

Ardından, html'nizde temel yol olarak "özel" paketini kullanarak bir kaynağa başvurabilirsiniz:

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

1

Lithu TV'nin cevabının Hızlı Sürümü:

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

1

Adam Alexanders Objective C cevabının hızlı versiyonu:

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

0

Görüntülere göreli bağlantılar kullanırsanız, iOS uygulaması derlendikten sonra tüm klasör yapıları korunmadığından görüntüler görüntülenmez. Yapabileceğiniz şey, ' .bundle ' dosya adı uzantısını ekleyerek yerel web klasörünüzü bir pakete dönüştürmektir .

Yerel web siteniz " www " klasöründe bulunuyorsa , bu ad " www.bundle " olarak yeniden adlandırılmalıdır . Bu, görüntü klasörlerinin ve dizin yapısının korunmasını sağlar. Ardından ' index.html ' dosyasını WebView'e ' baseURL ' (www.bundle yoluna ayarlı) ile HTML dizesi olarak göreli resim bağlantılarının yüklenmesini etkinleştirin.

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

Bu cevaplar bana yardımcı oldu - özellikle dosya: \\ xxxxxxx.xxx, ancak görüntüyü görüntülemek için bir geçici çözüm yapmak zorunda kaldım.

Benim durumumda, sunucumda belgeler dizinine indirdiğim bir HTML dosyası var. Ben işe alamadım bir UIWebView yerel bir grafik ile görüntülemek istiyorum. İşte yaptım:

  1. Dosyayı NSBundle'dan yerel belgeler dizinine kopyalayın
  2. HTML dokümanımdaki dosyaya "dosya: \\ dosyaadı.png" olarak başvur

Başlangıçta dosyayı belgeler dizinine kopyalayın:

-(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);
}

-7

Rss-feed (RSSItems içinde olsun) için karmaşık çözümüm (veya öğreticim) yalnızca cihazda çalışıyor:

#define CACHE_DIR       [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]

for (RSSItem *item in _dataSource) {

    url = [NSURL URLWithString:[item link]];
    request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"GET"];

    [NSURLConnection sendAsynchronousRequest:request
                                       queue:queue
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

                               @autoreleasepool {

                                   if (!error) {

                                       NSString *html = [[NSString alloc] initWithData:data
                                                                              encoding:NSWindowsCP1251StringEncoding];

                                       {
                                           NSError *error = nil;

                                           HTMLParser *parser = [[HTMLParser alloc] initWithString:html error:&error];

                                           if (error) {
                                               NSLog(@"Error: %@", error);
                                               return;
                                           }

                                           HTMLNode *bodyNode = [parser body];

                                           NSArray *spanNodes = [bodyNode findChildTags:@"div"];

                                           for (HTMLNode *spanNode in spanNodes) {
                                               if ([[spanNode getAttributeNamed:@"class"] isEqualToString:@"page"]) {

                                                   NSString *absStr = [[response URL] absoluteString];
                                                   for (RSSItem *anItem in _dataSource)
                                                       if ([absStr isEqualToString:[anItem link]]){

                                                           NSArray *spanNodes = [bodyNode findChildTags:@"img"];
                                                           for (HTMLNode *spanNode in spanNodes){
                                                               NSString *imgUrl = [spanNode getAttributeNamed:@"src"];
                                                               if (imgUrl){
                                                                   [anItem setImage:imgUrl];
                                                                   break;
                                                               }
                                                           }

                                                           [anItem setHtml:[spanNode rawContents]];
                                                           [self subProcessRSSItem:anItem];
                                                       }
                                               }
                                           }

                                           [parser release];
                                       }

                                       if (error) {
                                           NSLog(@"Error: %@", error);
                                           return;
                                       }

                                       [[NSNotificationCenter defaultCenter] postNotificationName:notification_updateDatasource
                                                                                           object:self
                                                                                         userInfo:nil];

                                   }else
                                       NSLog(@"Error",[error userInfo]);
                               }
                           }];

ve

- (void)subProcessRSSItem:(RSSItem*)item{

NSString *html = [item html];
if (html) {

    html = [html stringByReplacingOccurrencesOfString:@"<div class=\"clear\"></div>"
                                           withString:@""];

    html = [html stringByReplacingOccurrencesOfString:@"<p class=\"link\">"
                                           withString:@""];

    html = [html stringByReplacingOccurrencesOfString:@"<div class=\"page\">"
                                           withString:@""];

    html = [html stringByReplacingOccurrencesOfString:@"</div>"
                                           withString:@""];

    NSArray *array1 = [html componentsSeparatedByString:@"<a"];
    if ([array1 count]==2) {
        NSArray *array2 = [html componentsSeparatedByString:@"a>"];

        html = [[array1 objectAtIndex:0] stringByAppendingString:[array2 objectAtIndex:1]];
    }

    NSURL *url;
    NSString *fileName;
    NSString *filePath;
    BOOL success;
    if ([item image]) {

        url = [NSURL URLWithString:
                      [hostString stringByAppendingString:[item image]]];
        NSData *imageData = [NSData dataWithContentsOfURL:url];

        fileName = [[[url relativePath] componentsSeparatedByString:@"/"] lastObject];

        filePath = [NSString stringWithFormat:@"%@/%@",
                              CACHE_DIR,
                              fileName];

        //save image locally
        success = [[NSFileManager defaultManager] createFileAtPath:filePath
                                                               contents:imageData
                                                             attributes:nil];

        //replace links
        html = [html stringByReplacingOccurrencesOfString:[item image]
                                               withString:filePath];

        [item setImage:fileName];

        //Передадим обновление интерфейса, снабдив индексом обновляемой ячейки
        [[NSNotificationCenter defaultCenter] postNotificationName:notification_updateRow
                                                            object:self
                                                          userInfo:[NSDictionary dictionaryWithObject:@([_dataSource indexOfObject:item])
                                                                                               forKey:@"row"]];
    }

    //finalize html
    html = [NSString stringWithFormat:@"<html><body>%@</body></html>",html];

    fileName = [[[item link] componentsSeparatedByString:@"/"] lastObject];
    filePath = [NSString stringWithFormat:@"%@/%@",
                CACHE_DIR,
                fileName];
    success = [[NSFileManager defaultManager] createFileAtPath:filePath
                                                      contents:[html dataUsingEncoding:NSUTF8StringEncoding]
                                                    attributes:nil];

    [item setHtml:
     (success)?filePath:nil];//for direct download in other case
}

}

Açık Görünüm denetleyicisi

- (void)viewDidAppear:(BOOL)animated{

RSSItem *item = [[DataSingleton sharedSingleton] selectedRSSItem];

NSString* htmlString = [NSString stringWithContentsOfFile:[item html]
                                                 encoding:NSUTF8StringEncoding error:nil];
NSURL *baseURL = [NSURL URLWithString:CACHE_DIR];

[_webView loadHTMLString:htmlString
                 baseURL:baseURL];

}

rss öğe sınıfı

#import <Foundation/Foundation.h>

@interface RSSItem : NSObject

@property(nonatomic,retain) NSString *title;
@property(nonatomic,retain) NSString *link;
@property(nonatomic,retain) NSString *guid;
@property(nonatomic,retain) NSString *category;
@property(nonatomic,retain) NSString *description;
@property(nonatomic,retain) NSString *pubDate;
@property(nonatomic,retain) NSString *html;
@property(nonatomic,retain) NSString *image;
@end

resimli herhangi bir html'nin parçası

<html><body>
<h2>blah-blahTC One Tab 7</h2>
<p>blah-blah НТС One.</p>
<p><img width="600" height="412" alt="" src="/Users/wins/Library/Application Support/iPhone Simulator/5.0/Applications/2EAD8889-6482-48D4-80A7-9CCFD567123B/Library/Caches/htc-one-tab-7-concept-1(1).jpg"><br><br>
blah-blah (Hasan Kaymak) blah-blah HTC One Tab 7, blah-blah HTC One. <br><br>
blah-blah
 microSD.<br><br>
blah-blah Wi-Fi to 4G LTE.</p>
</p>
</body></html>

Resim htc-one-tab-7-concept-1 (1) .jpg adı için kaydedildi

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.