前言
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; }
网友评论