Tamil Selvan R
Tamil Selvan R

Reputation: 168

In Obj C, How to add SVG blueprint image and rendering the data from UIWebView?

I have loaded SVG image into the UIWebView that working charm but rendering data from select position of SVG image was not happened. Even i was searched more about that i didn't get any info regarding this functionalities. As well, I have tried SVGKit but i didn't understand complete scenario of SVGKit so the reason i chosen UIWebView.If any one knows about this functionalities plz comment here.

the SVG map seems like below one.i found few link about SVG image but those are not loading by UIWebView. SVGKIT & chensheng12330/SVGKitDemo

enter image description here

Upvotes: 2

Views: 538

Answers (1)

Tamil Selvan R
Tamil Selvan R

Reputation: 168

//Create a empty test.html and override below html code and reload the Webview.   
   -(UIWebView *)setup{
        self.svgName=@"third";
        //create a webview
        UIWebView *webview = [[UIWebView alloc] init];
        //create a empty html file and convert the svg into html and save dynamically
        NSString *testPath = [[NSBundle mainBundle]pathForResource:@"test"ofType:@"html"inDirectory:nil ];
        NSString *filePath = [self writeAndAppendString:[self getHTMLStringForLoadSVG:[self.svgName stringByAppendingString:@".svg"]] toFile:testPath];
        //load svg file into the webview
        //NSString *path = [[NSBundle mainBundle] pathForResource:@"loadSVG" ofType:@"html"];
        NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:filePath];
        NSURLRequest *req = [NSURLRequest requestWithURL:fileURL];
        [ webview loadRequest:req];
        [ webview setScalesPageToFit:YES];
        [webview setUserInteractionEnabled:NO];
       // webview.contentMode = UIViewContentModeScaleAspectFit;
        [webview setBackgroundColor:[UIColor cyanColor]];
        webview.delegate = self;
        return webview;
    }
    //HTML file
    -(NSString *)getHTMLStringForLoadSVG :(NSString *)svgFileName{
        NSString *jQueryLib = @"https://code.jquery.com/jquery-3.2.1.min.js";
        NSString *idOfJQuery = @"test";
        NSString *type = @"image/svg+xml";
        NSString *id = @"test";
        return [NSString stringWithFormat:@"<!DOCTYPE html>\n<html>\n<head>\n<script src='%@'></script>\n<script>\n  window.clickedId;\n$(document).ready(function() {\nvar embed = document.getElementById('%@');\nembed.addEventListener('load', function(){\nvar svg = embed.getSVGDocument();\nvar pathElements = svg.getElementsByTagName('path');\nfor(var i=0;i<pathElements.length;i++){\n$(pathElements[i]).bind('click', function() {\nwindow.clickedId = $(this).attr('id');\n});\n}});\n});\nfunction clicked(){\n return window.clickedId;\n}</script>\n</head>\n<body>\n<embed src='%@' type='%@' id='%@'/>\n</body>\n</html>", jQueryLib,idOfJQuery,svgFileName,type,id];
    }
    - (void)tapAction:(UITapGestureRecognizer *)sender{
        [self performSelector:@selector(getJSObj) withObject:nil afterDelay:1.0];
    }
    -(void)getJSObj{
        NSLog(@"return value :%@",[self.self.mapWebview stringByEvaluatingJavaScriptFromString:@"clicked()"]);
    }


    //write the code of converting svg to html code dynamically
    - (NSString *)writeAndAppendString:(NSString *)str toFile:(NSString *)fileName {
        NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSFileManager *fileManager = [NSFileManager defaultManager];
        if ([fileManager fileExistsAtPath:fileName]) {
            NSString *testP = [[paths firstObject] stringByAppendingPathComponent:@"testHtml.html"];
            NSString *testPath = [[NSBundle mainBundle]pathForResource:svgName ofType:@"svg"inDirectory:nil ];
            NSString *testSvgP = [[paths firstObject] stringByAppendingPathComponent:[svgName stringByAppendingString:@".svg"]];
            [[NSFileManager defaultManager] copyItemAtPath:testPath toPath:testSvgP error:nil];
            [[NSFileManager defaultManager] copyItemAtPath:fileName toPath:testP error:nil];
            // Add the text at the end of the file.
            NSFileHandle *fileHandler = [NSFileHandle fileHandleForUpdatingAtPath:testP];
            //  [fileHandler seekToEndOfFile];
            [fileHandler writeData:data];
            [fileHandler closeFile];
            return testP;
        }
        return nil;
    }

Upvotes: 3

Related Questions