iOS UILabel與UITextView加載圖片富文本點擊看大圖

背景:

功能:回復列表
要求:界面按UI給的效果圖
收到的數據:帶各種標簽的html格式的字符串(包括web端的表情圖片)

如果只是想簡單的加載HTML(包括圖片),點擊這里

解決方案:UILabelUITextView加載富文本取代帶圖片的HTML

  1. 過濾掉 web端 回復內容 已知 的所有標簽
NSString *text = allHtmlText;
//NSLog(@"這是評論的內容%@",text);
text = [text stringByReplacingOccurrencesOfString:@"<p>" withString:@""];
text = [text stringByReplacingOccurrencesOfString:@"</p>" withString:@"\n"];
text = [text stringByReplacingOccurrencesOfString:@"<u>" withString:@""];
text = [text stringByReplacingOccurrencesOfString:@"</u>" withString:@""];
text = [text stringByReplacingOccurrencesOfString:@"<strong>" withString:@""];
text = [text stringByReplacingOccurrencesOfString:@"</strong>" withString:@""];
text = [text stringByReplacingOccurrencesOfString:@"<em>" withString:@""];
text = [text stringByReplacingOccurrencesOfString:@"</em>" withString:@""];

2、創建attributedString并獲取其中的圖片URL及其范圍

NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:text];
[self getImageurlFromHtml:string];//具體實現放在文章后面
  1. 循環遍歷創建圖片附件 并 替換原有范圍的字符串

    for (int i= 0 ; i< self.rangeArr.count; i++) {
        // 創建圖片圖片附件
        NSTextAttachment *attach = [[NSTextAttachment alloc] init];
        
        NSString *imageUrlStr = self.imageurlArray[i];
        
        NSURL *url = [NSURL URLWithString:imageUrlStr];
        
        NSData *imageData = [NSData dataWithContentsOfURL:url];
        
        attach.image = [UIImage imageWithData:imageData];
        
        attach.bounds = CGRectMake(0, 0, 15, 15);
        
        NSAttributedString *attachString = [NSAttributedString attributedStringWithAttachment:attach];
        
        // 點擊圖片跳轉到safari
        NSMutableAttributedString *maImageStr = [[NSMutableAttributedString alloc] initWithAttributedString:attachString];
        
        [maImageStr addAttribute:NSLinkAttributeName value:self.imageurlArray[i] range:NSMakeRange(0, maImageStr.length)];
        
        NSString *rangeStr = self.rangeArr[i];
        
        NSRange range = NSRangeFromString(rangeStr);
        
        if (i>0) {
            NSInteger length = 0;
            for (int j = 0; j<i; j++) {
                NSString *rangeStr0 = self.rangeArr[j];
                
                NSRange range0 = NSRangeFromString(rangeStr0);
                length = length + range0.length;
                NSLog(@"\nlocation:%ld\nlength:%ld\nstringlength:%ld",range0.location,range0.length,string.length);
            }
            
            range.location = range.location - length + i;
        }
        //創建NSMutableParagraphStyle實例
        NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc]init];
        //設置行距
        [style setLineSpacing:2.5];
        //根據給定長度與style設置attStr式樣
        [string addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, string.length)];
        [string replaceCharactersInRange:range withAttributedString:maImageStr];
        
    }

4、設置UI給定的樣式

    self.textView.scrollEnabled = NO;
    [string addAttribute: NSForegroundColorAttributeName value: [UIColor orangeColor] range: NSMakeRange(0, string.length)];
    self.textView.attributedText = string
  • 獲取圖片URL方法
- (NSArray *) getImageurlFromHtml:(NSMutableAttributedString *) webString
{
    if (webString.length==0) {
        return nil;
    }
    NSString *webStr  = [NSString stringWithFormat:@"%@",webString];
    self.imageurlArray = [NSMutableArray arrayWithCapacity:1];
    self.rangeArr = [NSMutableArray arrayWithCapacity:1];
    
    //標簽匹配
    NSString *parten = @"<img(.*?)>";
    NSError* error = NULL;
    NSRegularExpression *reg = [NSRegularExpression regularExpressionWithPattern:parten options:0 error:&error];
    
    NSArray* match = [reg matchesInString:webStr options:0 range:NSMakeRange(0, [webString length] - 1)];
    
    for (NSTextCheckingResult * result in match) {
        
        //過去數組中的標簽
        NSRange range = [result range];
        [self.rangeArr addObject:NSStringFromRange(range)];
        NSString * subString = [webStr substringWithRange:range];
        
        
        //從圖片中的標簽中提取ImageURL
        NSRegularExpression *subReg = [NSRegularExpression regularExpressionWithPattern:@"http://(.*?)\"" options:0 error:NULL];
        NSArray* match = [subReg matchesInString:subString options:0 range:NSMakeRange(0, [subString length] - 1)];
        NSTextCheckingResult * subRes = match[0];
        NSRange subRange = [subRes range];
        subRange.length = subRange.length -1;
        NSString * imagekUrl = [subString substringWithRange:subRange];
        
        //將提取出的圖片URL添加到圖片數組中
        [self.imageurlArray addObject:imagekUrl];
    }
    
    return self.imageurlArray;
}

點個贊或者小紅心再走吧 ^ - ^
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,951評論 19 139
  • HTML標簽解釋大全 一、HTML標記 標簽:!DOCTYPE 說明:指定了 HTML 文檔遵循的文檔類型定義(D...
    米塔塔閱讀 3,321評論 1 41
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協議。它實...
    香橙柚子閱讀 24,111評論 8 183
  • 一個正常的普通的媽媽,會哭、會笑、會鬧、也會怕,情緒正常表現,不會有太多壓抑和掩飾。一個正常的普通人最基本的情緒就...
    欣欣棒棒糖閱讀 295評論 0 0
  • “所以我要教育教育他。” “不用這么著急。”八重子拽住了昭夫的胳膊,“等安穩下來再說,好不好?孩子也受了打...
    叨叨叨神經閱讀 194評論 0 0