UILabel加载html

前言

       iOS中加载html可以使用WebView,但是webview使用比较麻烦,需要设置字体大小,以及根据observer的变化判断是否已经加载完成,如果html文本较多,则需要1-2s的加载时间,这于用户是不能忍受的。使用UILabel就方便许多,计算出FitSize,设置一下即可。

在任何一处编写相同的适配代码,这是很low的做法。因此笔者将它封装成一个分类。

实现方法

NSString+htmlString.m

/**
 获取html字符串fitSize

 @param currentSize 传入当前label大小
 @param font 传入当前label的font
 @param attrStr 传出参数
 @return 返回fitSize
 */
- (CGSize)getHtmlFitSizeWithCurrentSize: (CGSize)currentSize
                                   font: (UIFont*)font
                    outAttributedString: (NSMutableAttributedString**)attrStr
{
    NSData* htmlStrData = [self dataUsingEncoding: NSUnicodeStringEncoding];
    NSDictionary* options = @{ NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType };

    (*attrStr) = [[NSMutableAttributedString alloc] initWithData: htmlStrData
                                                         options: options
                                              documentAttributes: nil
                                                           error: nil];

    [(*attrStr) addAttribute: NSFontAttributeName
                              value: font
                              range: NSMakeRange(0, (*attrStr).length)];

    CGRect fitRect = [(*attrStr) boundingRectWithSize: currentSize
                                              options:
                      NSStringDrawingUsesLineFragmentOrigin |
                      NSStringDrawingUsesFontLeading
                                              context: nil];

    fitRect.size.height += 1;   // 如果UILabel的高度固定,加1可以使图片显示出来

    return fitRect.size;
}

使用说明

在controller中调用方法,设置显示

- (void)loadHtmlOnView: (NSString*)htmlStr {
    NSMutableAttributedString* attrMutStr;
    CGSize fitSize = [htmlStr getHtmlFitSizeWithCurrentSize: self.htmlLbl.frame.size
                                                       font: self.htmlLbl.font
                                        outAttributedString: &attrMutStr];

    CGRect finalFrame;

    finalFrame.origin = self.htmlLbl.frame.origin;
    finalFrame.size = fitSize;

    self.htmlLbl.frame = finalFrame;
    self.htmlLbl.attributedText = attrMutStr;
}

你可能感兴趣的:(UILabel加载html)