此方法適用于CollectionView,tableView
解決了以下幾個(gè)問題
- 解決了由于WebView中圖片過大或者過小而顯示不全的問題
- 解決了循環(huán)刷新CollectionView,tableView的問題
- 解決了高度計(jì)算不準(zhǔn)確的問題
轉(zhuǎn)載請注明出處
性能良好
NSString+js.h
//by:HQ
#import "NSString+js.h"
/**
寬度計(jì)算
@param width 屏幕寬度
@return 寬度
*/
+ (instancetype)getJSWithScreentWidth:(CGFloat) width;
/**
高度計(jì)算
@param webView
@return 高度
*/
+ (instancetype)getJSWithScreentHeightWithWebView:(UIWebView*)webView;
@end
NSString+js.m
//by:HQ
#import "NSString+js.h"
@implementation NSString (js)
//寬度計(jì)算
+ (instancetype)getJSWithScreentWidth:(CGFloat) width{
NSString *path = [[NSBundle mainBundle] pathForResource:@"webviewDeal.js" ofType:nil];
NSString *js = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];
return [NSString stringWithFormat:@"%@ \n autoSizeFit(%@);",js,[NSString stringWithFormat:@"%.2f",width]];
}
//高度計(jì)算
+ (instancetype)getJSWithScreentHeightWithWebView:(UIWebView *)webView{
CGFloat height =[[webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('body')[0].scrollHeight"] floatValue];
return [NSString stringWithFormat:@"%f",height];
}
@end
計(jì)算寬度核心代碼
新建一個(gè).js文件,把代碼復(fù)制進(jìn)去(例如:webviewDeal.js)
// by HQ
var autoSizeFit = function(screenWidth){
//1.設(shè)置所有字體
var body = document.getElementsByTagName("body")[0];
//設(shè)置body的寬度
body.style.width = screenWidth;
//設(shè)置body的字體
var bodyStyleFontSize = body.style.fontSize;
//設(shè)置整個(gè)body的寬度
var bodyStyleWidth = body
if(bodyStyleFontSize.length<=0){
document.getElementsByTagName("body")[0].style.fontSize = 14;
}
//2獲取table的寬度
var tables = document.getElementsByTagName("table");
for(var i=0;i<tables.length;i++){
//2.1.設(shè)置所有表格的字體
//判斷是否有style屬性的fontSize是否有值
var table = tables[i];
var tableStyleFontSize = table.style.fontSize;
if(tableStyleFontSize.length<=0){//沒有設(shè)置了table的fontSize
table.style.fontSize = 14;
}
//2.2.設(shè)置表格的寬度
var tableStyleWidth = table.style.width;
table.style.width = screenWidth;
}
//3.設(shè)置圖片
var images = document.getElementsByTagName("img");
for(var i=0;i<images.length;i++){
var image = images[i];
//設(shè)置圖片的寬高比例
var imgWidth = image.width;
var imgHeight = image.height;
var scale = imgHeight/imgWidth;
//再通過比例來設(shè)置圖片的寬高
image.width = screenWidth;
image.height = screenWidth*scale;
}
//4.設(shè)置所有div的寬度
var divs = document.getElementsByTagName("div");
for(var i=0;i<divs.length;i++){
var div = divs[i];
div.style.width = screenWidth;
}
//5.設(shè)置ul
var uls = document.getElementsByTagName("ul");
for(var i=0;i<uls.length;i++){
var ul = uls[i];
ul.style.width = screenWidth;
}
}
如何使用?
//by:HQ
#pragma mark - UIWebViewDelegate
-(void)webViewDidFinishLoad:(UIWebView *)webView{
//注入js,設(shè)置寬度
NSString *jsStr = [NSString getJSWithScreentWidth:kSCREEN_WIDTH-35];
[webView stringByEvaluatingJavaScriptFromString:jsStr];
//獲取高度
CGFloat height = [NSString getJSWithScreentHeightWithWebView:webView].floatValue;
//獲取模型的高度,判斷模型中的高度是不是WebView的高度,如果不是則賦值給模型,賦值給模型后,高度相等,不在進(jìn)入判斷語句內(nèi),不再出現(xiàn)循環(huán)刷新問題
ProductInfo * productInfo = self.concroteDetailsModel.productInfo;
if (height!=productInfo.descriptionCellHigh) {
productInfo.descriptionCellHigh = height;
[self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:4]];
}
}