UI WebView 내에서 HTML 및 로컬 이미지 사용
앱에 다른 URL에 연결할 이미지를 표시하는 데 사용할 UI WebView가 있습니다.
사용 중
<img src="image.jpg" /> to load the image.
문제는 이미지가 로드되지 않는다는 것입니다(즉).찾을 수 없음). 프로젝트에 리소스로 추가되어 번들에 복사되어 있는 경우에도 마찬가지입니다.
NSBundle을 사용하여 이미지의 전체 경로를 확인하고 이미지를 사용하려고 했지만 웹 보기에 여전히 표시되지 않습니다.
아이디어 있어요?
상대 경로 또는 파일: 이미지를 참조하는 경로는 UI WebView에서 작동하지 않습니다.대신 HTML을 올바른 기준으로 보기에 로드해야 합니다.URL:
NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];
[webView loadHTMLString:htmlString baseURL:baseURL];
그런 다음 이미지를 다음과 같이 참조할 수 있습니다.
<img src="myimage.png">
(uiwebview에서 다시 방문)
사용:
[webView loadHTMLString:htmlString baseURL:[[NSBundle mainBundle] bundleURL]];
저도 방금 이 문제에 부딪혔어요.저의 경우, 저는 지역화되지 않은 이미지와 다국어로 된 이미지를 다루고 있었습니다.기본 URL에서 지역화된 폴더 내의 이미지를 가져오지 못했습니다.저는 다음을 수행하여 이 문제를 해결했습니다.
// 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];
그런 다음 콘텐츠를 로드할 때 UI WebView HTML 코드에서 imgHTMLTAG를 사용합니다.
이것이 같은 문제에 부딪힌 사람에게 도움이 되기를 바랍니다.
base64 이미지 문자열을 사용해 보십시오.
NSData* data = UIImageJPEGRepresentation(image, 1.0f);
NSString *strEncoded = [data base64Encoding];
<img src='data:image/png;base64,%@ '/>,strEncoded
저도 비슷한 문제가 있었지만, 모든 제안이 도움이 되지 않았습니다.
하지만 문제는 *.png 자체였습니다.알파 채널이 없었습니다.Xcode는 배포 프로세스 중에 알파 채널이 없는 모든 png 파일을 무시합니다.
Swift 3에서:
webView.loadHTMLString("<img src=\"myImg.jpg\">", baseURL: Bundle.main.bundleURL)
이것은 이미지가 폴더 안에 있을 때도 아무런 수정 없이 작동했습니다.
"MyProj"에 파일 추가를 선택하고 폴더 참조 만들기를 선택하여 프로젝트에 폴더(예: 하위 폴더 CSS, img 및 js 및 file test.html)를 추가할 수 있습니다.이제 다음 코드는 참조된 모든 이미지, CSS 및 Javascript를 처리합니다.
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"WEB/test.html" ofType:nil];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:filePath]]];
iOS 6 Programming Cookbok에서 몇 장을 읽고 목표 C와 iOS 프로그래밍을 배우기 시작한 후, 추가하고 싶은 것은 사용자 지정 번들에서 리소스를 로드하고 웹 뷰에서 사용할 경우 다음과 같이 수행할 수 있다는 것입니다.
NSString *resourcesBundlePath = [[NSBundle mainBundle] pathForResource:@"Resources" ofType:@"bundle"];
NSBundle *resourcesBundle = [NSBundle bundleWithPath:resourcesBundlePath];
[self.outletWebView loadHTMLString:[html description] baseURL:[resourcesBundle bundleURL]];
그런 다음 HTML에서 "사용자 정의" 번들을 기본 경로로 사용하는 리소스를 참조할 수 있습니다.
body {
background-image:url('img/myBg.png');
}
리투트의 빠른 버전.V의 답변:
webView.loadHTMLString(htmlString, baseURL: NSBundle.mainBundle().bundleURL)
신속한 Adam Alexanders 목표 C의 답변:
let logoImageURL = NSURL(fileURLWithPath: "\(Bundle.main.bundlePath)/PDF_HeaderImage.png")
이미지에 대한 상대 링크를 사용하는 경우 iOS 앱이 컴파일된 후 모든 폴더 구조가 보존되지 않기 때문에 이미지가 표시되지 않습니다.대신 '.bundle' 파일 이름 확장자를 추가하여 로컬 웹 폴더를 번들로 변환할 수 있습니다.
따라서 로컬 웹 사이트가 "www" 폴더에 포함되어 있으면 이 이름을 "www.bundle"로 변경해야 합니다.이렇게 하면 이미지 폴더와 디렉터리 구조를 보존할 수 있습니다.그런 다음 'index.html' 파일을 'base'가 포함된 HTML 문자열로 WebView에 로드합니다.URL'(www.bundle 경로로 설정)을 클릭하여 상대 이미지 링크를 로드할 수 있습니다.
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];
}
이 답변들은 저에게 도움이 되었습니다. 특히 파일:\xxxxxxxxxxxxxx.xxx, 하지만 이미지를 표시하기 위해 해결 방법을 강구해야 했습니다.
나의 경우, 나의 서버에 HTML 파일이 있고, 그것을 문서 디렉토리에 다운로드합니다.작업할 수 없는 UI 웹 뷰에 로컬 그래픽으로 표시하고 싶습니다.제가 한 일은 다음과 같습니다.
- NSBundle에서 로컬 문서 디렉토리로 파일 복사
- HTML 문서의 파일을 "file:\\filename.png"로 참조합니다.
시작할 때 파일을 문서 디렉터리에 복사합니다.
-(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);
}
RSS 피드(RSSItems 가져오기)에 대한 복잡한 솔루션(또는 자습서)은 다음 장치에서만 작동합니다.
#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]);
}
}];
그리고.
- (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
}
}
View 컨트롤러에서
- (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 항목 클래스
#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
이미지가 있는 HTML의 일부
<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>
이름 htc-one-tab-7-concept-1(1).jpg에 저장된 이미지
언급URL : https://stackoverflow.com/questions/747407/using-html-and-local-images-within-uiwebview
'programing' 카테고리의 다른 글
Firebase용 클라우드 기능 - getaddrinfo ENOTFound (0) | 2023.06.30 |
---|---|
오른쪽에서 줄을 잡다 (0) | 2023.06.30 |
C 프로그래밍에서 배열에 요소를 추가하는 방법을 설명할 수 있는 사람이 있습니까? (0) | 2023.06.30 |
Giton 비트 버킷:공용 SSH 키를 업로드한 후에도 항상 암호를 요청함 (0) | 2023.06.30 |
사전에서 여러 키를 안전하게 제거 (0) | 2023.06.30 |