ইউআইবিউবভিউয়ের মধ্যে এইচটিএমএল এবং স্থানীয় চিত্র ব্যবহার করা


164

আমার অ্যাপটিতে আমার একটি ইউআইবিউব ভিউ রয়েছে যা আমি একটি চিত্র প্রদর্শন করতে ব্যবহার করতে চাই যা অন্য url এর সাথে লিঙ্ক করবে।

আমি ব্যাবহার করছি

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

সমস্যাটি হ'ল চিত্রটি লোড হয় না (যেমন এটি সন্ধান করা যায় না) যদিও এটি আমার প্রকল্পের উত্স হিসাবে যুক্ত হয়েছে এবং বান্ডিলটিতে অনুলিপি করা হয়েছে।

আমি চিত্রটির পুরো পাথ পেতে এনএসবান্ডেল ব্যবহার করে চেষ্টা করেছি এবং এটি এখনও ওয়েব ভিউতে প্রদর্শিত হয় না।

কোন ধারনা?


আমি এখন আর আইফোন ওএস 3.0.০ হিসাবে এটি করতে সক্ষম নই। :( আরও তথ্য (StackOverflow.com)।
জো ডি অ্যান্ড্রিয়া

8
কেন ডাউন ভোট? : /
জাসারিন

5
এটি অগত্যা যে তারা খারাপ। তাদের কোনও বৈধ কারণ থাকতে পারে? আমরা সম্ভবত জানি না। তারা যদি কোনও মন্তব্যে কেন ভোট দিয়েছিল তা ব্যাখ্যা করার সৌজন্য
সাক্ষ্য থাকলে

63
একটি ভোট ডাউন সম্পর্কে একটি মন্তব্য লিখতে বাধ্যতামূলক করা উচিত।
রবার্ট

@ জাসারিন: আমার একই কার্যকারিতা দরকার। তবে আমি বুঝতে পারি না যে [ওয়েবউইউ লোড এইচটিএমএল স্ট্রিং: এইচটিএমএল স্ট্রিং বেস URL: বেস ইউআরএল] এবং কীভাবে আমি আমার চিত্রকে এইচটিএমএলতে রেখেছি এইচটিএমএল স্ট্রিংয়ে পাস করা উচিত।
আইফোন

উত্তর:


291

আপেক্ষিক পাথ বা ফাইল ব্যবহার করুন: চিত্রগুলি উল্লেখ করতে পাথগুলি UIWebView এর সাথে কাজ করে না। পরিবর্তে আপনাকে সঠিক বেস URL সহ ভিউটিতে এইচটিএমএলটি লোড করতে হবে:

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

তারপরে আপনি আপনার চিত্রগুলি এর মতো উল্লেখ করতে পারেন:

<img src="myimage.png">

( ইউইউবভিউ থেকে পুনর্বিবেচনা করা হয়েছে )


15
[[এনএসবান্ডেল মেইনবান্ডেল] বান্ডেল URL] আমরা এটিকে বান্ডিল ইউআরএল হিসাবে ব্যবহার করতে পারি
নবীন শান

2
এগুলি আমার জন্য আমার ওয়েবভিউতে একটি স্ট্রিং দেয় যা আমি আমার এইচটিএমএল স্ট্রিংয়ের জন্য সংজ্ঞায়িত করেছি। উদাহরণস্বরূপ, পৃষ্ঠায় এটি প্রদর্শিত সমস্ত হ'ল "ট্যুর এইচটিএমএল"
চেভি দ্য চোরকি

: একটি sidenote, যদি আপনি যেমন ইমেজ উল্টোদিকে জাভাস্ক্রিপ্ট ফাইল লোড করার চেষ্টা করছেন, আপনি ভাল হিসাবে এই তাকান করতে হবে stackoverflow.com/a/3629479/385619
Willster

জামারিন অ্যাড মনোর টাচ ওয়েবভি এর ক্ষেত্রে।
এরিক সাইমনিক

1
সিমুলেটারে নিখুঁতভাবে কাজ করুন তবে আমার ডিভাইসে নয়
jose920405

46

এটা ব্যবহার কর:

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

5
তবে আপনার উত্তরটি 3 বছর আগে পোস্ট করা উত্তরটির সাথে সমান ... আপনার উত্তরটি আলাদা কিছু দেয় না, এটি পোস্ট করার দরকার নেই কারণ গ্রহণযোগ্য উত্তর ইতিমধ্যে আপনার পোস্টকৃত বিষয়টিকে কভার করেছে।
জাসারিন

13
এটি গৃহীত উত্তরের একটি সুবিধাজনক এক-লাইন সংস্করণ - এটি এখানে না দিয়ে কোনও ক্ষতি করা হয়নি।
মুসিজেনেসিস

9
@Jasarien যে আদম আলেকজান্ডার দ্বারা উত্তর আগস্ট 2009 পর্যন্ত কিন্তু ম্যাক্স OS X এর সংস্করণ 10.6 এই নতুন সম্পত্তি থেকে একমাত্র সমাধান ছিল bundleURLNSBundle মধ্যে যোগ করা হয়েছিল। বান্ডেলপথ নেওয়ার এবং ইউআরএল রূপান্তর করার দরকার নেই। সুতরাং 10.6 এর বেশি সংস্করণে কাজ করা লোকদের জন্য এটি আরও ভাল সমাধান দেয়।
রিনিজ

সাম্প্রতিক এই পোস্টে প্রচুর ক্রিয়াকলাপ দেখছেন..আর কেন তা উল্লেখ করেনি?
লিথু টিভি

24

আমি শুধু এই সমস্যা মধ্যে দৌড়ে। আমার ক্ষেত্রে, আমি এমন কিছু চিত্র নিয়ে কাজ করছিলাম যা স্থানীয়করণ হয়নি এবং অন্যগুলি - একাধিক ভাষায়। একটি বেস ইউআরএল আমার জন্য স্থানীয় ফোল্ডারগুলির মধ্যে চিত্রগুলি পায় নি। আমি নিম্নলিখিতটি দ্বারা এটি সমাধান করেছি:

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

তারপরে, আপনি সামগ্রীগুলি লোড করার সময় আপনার ইউআইউইভিউভিউ এইচটিএমএল কোডে আইএমজিএইচটিএমএল ট্যাগ ব্যবহার করুন।

আমি আশা করি এটি একই সমস্যার মধ্যে পড়ে যে কাউকে সহায়তা করে।


1
ব্যবহার file://করা আমার প্রয়োজন ছিল।
সুতরাং এটি

ভাল
লাগল

8

বেস 64 ইমেজ স্ট্রিং ব্যবহার করার চেষ্টা করুন।

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

NSString *strEncoded = [data base64Encoding];   

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

6

আমার একটি সিমিলার সমস্যা ছিল, তবে সমস্ত পরামর্শ কার্যকর হয়নি।

তবে সমস্যাটি ছিল * .png নিজেই। এটির কোনও আলফা চ্যানেল ছিল না । একরকম Xcode আলফা চ্যানেল ছাড়া সব PNG ফাইল উপেক্ষা করে প্রয়োগের প্রক্রিয়ার সময়।


এ থেকে বেরিয়ে আসার জন্য আপনি কী করেছেন? আপনি কি কোনও সমাধান খুঁজে পেয়েছেন? আমি একই সমস্যা সম্মুখীন। UIWebView এর কোনও আলফা চ্যানেল না থাকায় চিত্রগুলি প্রদর্শিত হচ্ছে না।
স্পালেজা

1
আমি আমার পিএনজি ফাইলগুলিতে একটি আলফা চ্যানেল যুক্ত করতে গিম্প ব্যবহার করেছি। দেখুন docs.gimp.org/en/gimp-layer-alpha-add.html

3

"মাইপ্রোজ" -এ ফাইল যুক্ত করে ফোল্ডার রেফারেন্স তৈরি করে নির্বাচন করে আপনি আপনার প্রকল্পে ফোল্ডার (সাব ফোল্ডার সিএসএস, আইএমজি এবং জেএস এবং ফাইল টেস্ট এইচটিটিএমএল যুক্ত করুন ) যুক্ত করতে পারেন । এখন নীচের কোডটি উল্লেখ করা সমস্ত চিত্র, সিএসএস এবং জাভাস্ক্রিপ্ট সম্পর্কে যত্ন নেবে

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

3

সুইফ্ট 3 এ:

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

ছবিটি কোনও পরিবর্তন ছাড়াই কোনও ফোল্ডারের অভ্যন্তরে থাকা অবস্থায়ও এটি আমার পক্ষে কাজ করেছিল।


2

আইওএস Program প্রোগ্রামিং কুকবোকের কয়েকটি অধ্যায় পড়ে এবং উদ্দেশ্য-সি এবং আইওএস প্রোগ্রামিং শিখতে শুরু করার পরে, আমি কেবল যুক্ত করতে চাই যে, যদি কেউ একটি কাস্টম বান্ডেল থেকে সংস্থানগুলি লোড করে এবং ওয়েব ভিউতে এটি ব্যবহার করে , এটি এভাবে সম্পাদন করা যেতে পারে:

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

তারপরে, আপনার এইচটিএমএলে আপনি "কাস্টম" বান্ডেলটিকে আপনার বেস পথ হিসাবে ব্যবহার করে কোনও উত্সকে উল্লেখ করতে পারেন:

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


1

অ্যাডাম আলেকজান্দার্স সিটির উত্তরটির সুইফ্ট সংস্করণ:

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

0

আপনি যদি চিত্রগুলির সাথে সম্পর্কিত লিঙ্ক ব্যবহার করেন তবে আইওএস অ্যাপ্লিকেশন সংকলিত হওয়ার পরে সমস্ত ফোল্ডার কাঠামো সংরক্ষণ করা হয়নি বলে চিত্রগুলি প্রদর্শিত হবে না। আপনি যা করতে পারেন তা হল আপনার স্থানীয় ওয়েব ফোল্ডারটিকে ' .bundle ' যুক্ত করে একটি বান্ডলে রূপান্তর করা ' ফাইলের এক্সটেনশান ।

সুতরাং যদি আপনার স্থানীয় ওয়েবসাইট কোনও " www " ফোল্ডারে থাকে তবে এটির নামকরণ " www.bundle " করা উচিত। এটি চিত্রের ফোল্ডার এবং ডিরেক্টরি কাঠামো সংরক্ষণের অনুমতি দেয়। তারপর 'লোড index.html ' দিয়ে একটি HTML স্ট্রিং হিসেবে ওয়েবদৃশ্য মধ্যে 'ফাইল baseURL ' (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];
}

0

এই উত্তরগুলি আমাকে সহায়তা করেছিল - বিশেষত ফাইল: xx xxxxxxx.xxx, তবে চিত্রটি প্রদর্শনের জন্য আমাকে একটি কাজ করতে হয়েছিল।

আমার ক্ষেত্রে, আমার সার্ভারে আমার একটি HTML ফাইল রয়েছে যা আমি নথির ডিরেক্টরিতে ডাউনলোড করি। আমি এটিতে কোনও ইউআইওউবভিউতে একটি স্থানীয় গ্রাফিক দিয়ে প্রদর্শন করতে চাই যা আমি কাজ করতে পারি না। আমি যা করেছি তা এখানে:

  1. স্থানীয় ডকুমেন্ট ডিরেক্টরিতে এনএসবান্ডেল থেকে ফাইলটি অনুলিপি করুন
  2. আমার এইচটিএমএল নথিতে ফাইলটিকে "ফাইল: \\ 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);
}

-7

আমার জটিল সমাধান (বা টিউটোরিয়াল) আরএসএস-ফিডের জন্য (আরএসএসআইটেমস পান) কেবলমাত্র ডিভাইসে কাজ করে:

#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
}

}

দেখুন নিয়ন্ত্রণকারী

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

}

আরএসএস আইটেম ক্লাস

#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><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-ধারণার -1 (1) .jpg নামের জন্য সংরক্ষিত হয়েছে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.