iOS中加載HTML數(shù)據(jù)怎披,并點擊圖片或鏈接進行相應的操作

開發(fā)中贫导,有時候我們需要展現(xiàn)HTML類型的數(shù)據(jù)件相,這時候声诸,我們多數(shù)選擇用UIWebView加載殊橙,但是當我們需要加載大量的HTML數(shù)據(jù)時衬衬,使用UIWebView加載殖妇,性能會降低刁笙,尤其是當UITableViewCell需要放大量的HTML數(shù)據(jù)時,如果你用UIWebView加載這些HTML數(shù)據(jù)谦趣,你會發(fā)現(xiàn)疲吸,tableview會有卡頓的現(xiàn)象。

那怎樣去優(yōu)化這個卡頓現(xiàn)象呢前鹅?我們知道WKWbebView的加載速度比UIWebView提升差不多一倍的, 內存使用上面,反而還少了一半摘悴,所以我們可以采用WKWebView對其進行優(yōu)化。今天把一個三方類介紹給大家舰绘,那就是IMYWebView,這個類兼容WKWebView和UIWebView蹂喻,實現(xiàn)了UIWebView到WKWebView的對接,即使你之前的項目是用的UIWebView,那也沒關系捂寿,只要將UIWebView換成IMYWebView就可以了口四。

另外,加載HTML數(shù)據(jù)自然絕多數(shù)會有圖片和內置鏈接秦陋,我們也會希望可以點擊圖片進行瀏覽蔓彩、放大和縮小,可以點開鏈接驳概,那么赤嚼,該怎樣去實現(xiàn)呢?

1顺又、在工程中導入IMYWebView

#import "IMYWebView.h"

2更卒、創(chuàng)建IMYWebView,并嵌套到TableView中,實現(xiàn)tableview的相關代理方法

@interface ViewController ()<UITableViewDataSource, UITableViewDelegate,IMYWebViewDelegate,HZPhotoBrowserDelegate>
@property(nonatomic, strong)UITableView *tableView;
@property(nonatomic, assign)CGFloat webviewHight;//記錄webview的高度
@property(nonatomic, copy)NSString *HTMLData;//需要加載的HTML數(shù)據(jù)
@property(nonatomic, strong)NSMutableArray *imageArray;//HTML中的圖片個數(shù)
@property(nonatomic, strong)IMYWebView *IMYwebView;
 
@end
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.navigationBar.translucent = NO;
    self.title = @"tableviewcell嵌套webview載HTML";
    self.view.backgroundColor = [UIColor whiteColor];
//    獲取HTML數(shù)據(jù)
     [self getHTMLData];
    
    _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width , self.view.frame.size.height - 64) style:UITableViewStylePlain];
    _tableView.dataSource = self;
    _tableView.delegate = self;
    
    _tableView.tableHeaderView = [[UIView alloc] init];
    [self.view addSubview:_tableView];
    _htmlWebView = [[IMYWebView alloc] init];
    _htmlWebView.frame = CGRectMake(0, 0, _tableView.frame.size.width, 1);
    _htmlWebView.delegate = self;
    _htmlWebView.scrollView.scrollEnabled = NO;//設置webview不可滾動待榔,讓tableview本身滾動即可
    _htmlWebView.scrollView.bounces = NO;
    _htmlWebView.opaque = NO;
    
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return 4;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    if (indexPath.row != 3) {
         return 60;
    }else{
        
        return _webviewHight;//cell自適應webview的高度
    }
   
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *identifier = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    if (!cell) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
            
                }
    if (indexPath.row == 3) {
        
        [cell.contentView addSubview:_htmlWebView];

        //加載HTML數(shù)據(jù)
        [_htmlWebView loadHTMLString:_HTMLData baseURL:nil];
        
    }else{
        
        cell.textLabel.text = [NSString stringWithFormat:@"第%ld行",(long)indexPath.row];
      
    }
     return cell;
}

3逞壁、實現(xiàn)IMYWebView的相關代理方法

-(void)webViewDidFinishLoad:(IMYWebView *)webView{
//加載完畢后重新計算webview的高度
    [self.htmlWebView evaluateJavaScript:@"document.documentElement.scrollHeight" completionHandler:^(id object, NSError *error) {
        CGFloat height = [object integerValue];
        
        if (error != nil) {
            
        }else{
            _webviewHight = height;
            [_tableView beginUpdates];
            self.htmlWebView.frame = CGRectMake(_htmlWebView.frame.origin.x,_htmlWebView.frame.origin.y, _tableView.frame.size.width, _webviewHight );
              [_tableView endUpdates];
        }
  
    }];
    
//    插入js代碼流济,對圖片進行點擊操作
    [webView evaluateJavaScript:@"function assignImageClickAction(){var imgs=document.getElementsByTagName('img');var length=imgs.length;for(var i=0; i < length;i++){img=imgs[i];if(\\"ad\\" ==img.getAttribute(\\"flag\\")){var parent = this.parentNode;if(parent.nodeName.toLowerCase() != \\"a\\")return;}img.onclick=function(){window.location.href='image-preview:'+this.src}}}" completionHandler:^(id object, NSError *error) {
        
    }];
    [webView evaluateJavaScript:@"assignImageClickAction();" completionHandler:^(id object, NSError *error) {
        
    }];

    //獲取HTML中的圖片
    [self getImgs];
 

}

-(BOOL)webView:(IMYWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
    
    if ([request.URL isEqual:@"about:blank"])
    {
        return true;
    }
    if ([request.URL.scheme isEqualToString: @"image-preview"])
    {
        
        NSString *url = [request.URL.absoluteString substringFromIndex:14];
        
        
        //啟動圖片瀏覽器, 跳轉到圖片瀏覽頁面
        if (_imageArray.count != 0) {
            
            HZPhotoBrowser *browserVc = [[HZPhotoBrowser alloc] init];
            browserVc.imageCount = self.imageArray.count; // 圖片總數(shù)
            browserVc.currentImageIndex = [_imageArray indexOfObject:url];//當前點擊的圖片
            browserVc.delegate = self;
            [browserVc show];
            
        }
        return NO;
        
    }
    
    //    用戶點擊文章詳情中的鏈接
    if ( navigationType == UIWebViewNavigationTypeLinkClicked ) {
        
            WebViewURLViewController *webViewVC = [WebViewURLViewController new];
            webViewVC.URLString = request.URL.absoluteString;
            [self.navigationController pushViewController:webViewVC animated:YES];
        
        
        return NO;
    }
        
        return YES;
}

4腌闯、獲取文章圖片個數(shù)的方法

#pragma mark -- 獲取文章中的圖片個數(shù)
- (NSArray *)getImgs
{
   
    NSMutableArray *arrImgURL = [[NSMutableArray alloc] init];
    for (int i = 0; i < [self nodeCountOfTag:@"img"]; i++) {
        NSString *jsString = [NSString stringWithFormat:@"document.getElementsByTagName('img')[%d].src", i];
        [_htmlWebView evaluateJavaScript:jsString completionHandler:^(NSString *str, NSError *error) {
            
            if (error ==nil) {
                [arrImgURL addObject:str];
            }
       
        }];
    }
    _imageArray = [NSMutableArray arrayWithArray:arrImgURL];
    
    
    return arrImgURL;
}

// 獲取某個標簽的結點個數(shù)
- (NSInteger)nodeCountOfTag:(NSString *)tag
{
    
    NSString *jsString = [NSString stringWithFormat:@"document.getElementsByTagName('%@').length", tag];
 
   int count =  [[_htmlWebView stringByEvaluatingJavaScriptFromString:jsString] intValue];
    
    return count;
}

5绳瘟、點擊圖片進行瀏覽的相關方法,這個圖片瀏覽是封裝好的一個瀏覽器姿骏,在這里暫時不做介紹

#pragma mark - photobrowser代理方法
- (UIImage *)photoBrowser:(HZPhotoBrowser *)browser placeholderImageForIndex:(NSInteger)index
{
    //圖片瀏覽時糖声,未加載出圖片的占位圖
    return [UIImage imageNamed:@"gg_pic@2x"];
    
}

- (NSURL *)photoBrowser:(HZPhotoBrowser *)browser highQualityImageURLForIndex:(NSInteger)index
{
    NSString *urlStr = [self.imageArray[index] stringByReplacingOccurrencesOfString:@"thumbnail" withString:@"bmiddle"];
   

6、最后的運行結果如圖:


結果示意圖

7.有時候我們需要給webview加個頭視圖或者尾視圖分瘦,跟隨webview一起滾動蘸泻,如果這時我們的webview不是嵌在tableview中的,那該怎么辦呢嘲玫?很簡單悦施,只要將頭視圖加在webview的scrollview上,設置scrollview的contentInset(UIEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right)頭視圖的高度為top去团,尾視圖的高度為bottom,根據(jù)自己的需要去設置相應的高度)就可以了

    //給scrollview添加頭視圖
    //設置web view的scrollView的上抡诞、左、下土陪、右的距離
    _wkwebView.scrollView.contentInset = UIEdgeInsetsMake(40, 0, 0, 0);
    _titleLabel = [[UILabel alloc] init];
    [_wkwebView.scrollView addSubview:_titleLabel];
    _titleLabel.frame = CGRectMake(0, -40, self.wkwebView.frame.size.width, 40);
    [self.wkwebView.scrollView addSubview:_titleLabel];
  _titleLabel.text = @"web view的頭視圖";

8昼汗、最后,給大家分享一些用js獲取網頁一些相關元素的代碼

document:屬性

document.title                 //設置文檔標題等價于HTML的<title>標簽
document.bgColor               //設置頁面背景色
document.fgColor               //設置前景色(文本顏色)
document.linkColor             //未點擊過的鏈接顏色
document.alinkColor            //激活鏈接(焦點在此鏈接上)的顏色
document.vlinkColor            //已點擊過的鏈接顏色
document.URL                   //設置URL屬性從而在同一窗口打開另一網頁
document.fileCreatedDate       //文件建立日期鬼雀,只讀屬性
document.fileModifiedDate      //文件修改日期顷窒,只讀屬性
document.fileSize              //文件大小,只讀屬性
document.cookie                //設置和讀出cookie
document.charset               //設置字符集 簡體中文:gb2312


document:方法
document.write()                      //動態(tài)向頁面寫入內容
document_createElement_x_x(Tag)           //創(chuàng)建一個html標簽對象
document.getElementByIdx_x_x(ID)           //獲得指定ID值的對象
document.getElementsByName(Name)      //獲得指定Name值的對象
document.body.a(oTag)


body:子對象

document.body                   //指定文檔主體的開始和結束等價于<body></body>
document.body.bgColor           //設置或獲取對象后面的背景顏色
document.body.link              //未點擊過的鏈接顏色
document.body.alink             //激活鏈接(焦點在此鏈接上)的顏色
document.body.vlink             //已點擊過的鏈接顏色
document.body.text              //文本色
document.body.innerText         //設置<body>...</body>之間的文本
document.body.innerHTML         //設置<body>...</body>之間的HTML代碼
document.body.topMargin         //頁面上邊距
document.body.leftMargin        //頁面左邊距
document.body.rightMargin       //頁面右邊距
document.body.bottomMargin      //頁面下邊距
document.body.background        //背景圖片
document.body.a(oTag) //動態(tài)生成一個HTML對象

location:子對象
document.location.hash          // #號后的部分
document.location.host          // 域名+端口號
document.location.hostname      // 域名
document.location.href          // 完整URL
document.location.pathname      // 目錄部分
document.location.port          // 端口號
document.location.protocol      // 網絡協(xié)議(http:)
document.location.search        // ?號后的部分

常用對象事件:
documeny.location.reload()          //刷新網頁
document.location.reload(URL)       //打開新的網頁
document.location.assign(URL)       //打開新的網頁
document.location.replace(URL)      //打開新的網頁

selection-選區(qū)子對象
document.selection

demo地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末源哩,一起剝皮案震驚了整個濱河市鞋吉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌励烦,老刑警劉巖坯辩,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異崩侠,居然都是意外死亡,警方通過查閱死者的電腦和手機坷檩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門却音,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人矢炼,你說我怎么就攤上這事系瓢。” “怎么了句灌?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵夷陋,是天一觀的道長欠拾。 經常有香客問我,道長骗绕,這世上最難降的妖魔是什么藐窄? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮酬土,結果婚禮上荆忍,老公的妹妹穿的比我還像新娘。我一直安慰自己撤缴,他們只是感情好刹枉,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屈呕,像睡著了一般微宝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上虎眨,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天蟋软,我揣著相機與錄音,去河邊找鬼专甩。 笑死钟鸵,一個胖子當著我的面吹牛,可吹牛的內容都是我干的涤躲。 我是一名探鬼主播棺耍,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼种樱!你這毒婦竟也來了蒙袍?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤嫩挤,失蹤者是張志新(化名)和其女友劉穎害幅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岂昭,經...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡以现,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了约啊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邑遏。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖恰矩,靈堂內的尸體忽然破棺而出记盒,到底是詐尸還是另有隱情,我是刑警寧澤外傅,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布纪吮,位于F島的核電站俩檬,受9級特大地震影響,放射性物質發(fā)生泄漏碾盟。R本人自食惡果不足惜棚辽,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巷疼。 院中可真熱鬧晚胡,春花似錦、人聲如沸嚼沿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骡尽。三九已至遣妥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間攀细,已是汗流浹背箫踩。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谭贪,地道東北人境钟。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像俭识,于是被迫代替她去往敵國和親慨削。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫套媚、插件缚态、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,022評論 4 62
  • iOS開發(fā)系列--網絡開發(fā) 概覽 大部分應用程序都或多或少會牽扯到網絡開發(fā),例如說新浪微博堤瘤、微信等玫芦,這些應用本身可...
    lichengjin閱讀 3,639評論 2 7
  • Day22 打開淘寶對著手機刷刷刷,近期發(fā)現(xiàn)自己好像有點強迫癥本辐,不把收藏的店鋪全部翻一遍就停不下來桥帆。 明天沒課,本...
    小懶說Yolo閱讀 442評論 0 1
  • 1 2009年4月慎皱,在班級同學都在忙著畢業(yè)論文环葵、各種畢業(yè)晚會的時候,我跟家里撒謊說和同學來杭州旅行宝冕,其實只是...
    冷師妹閱讀 1,675評論 16 10
  • 你要放心 無論怎樣的我 都不會去再打擾你半分 因為我知道,你不是那個一定要擁有的人 所以邓萨,親愛的 我所做的不過是 ...
    薄日閱讀 196評論 1 1