1:问题:类似于网易新闻详细页,UIScrollView上有WebView,WebView上有图片有文字,点击图片放大以后进入图片浏览,点击返回时不能立即滑动新闻页视图。
2:代码:
//在此方法中完成对webView触控的判断, 功能为UIWebView响应长按事件
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)_request navigationType:(UIWebViewNavigationType)navigationType {
NSString *requestString = [[_request URL] absoluteString];
NSArray *components = [requestString componentsSeparatedByString:@":"];
PowerLog(components);
if ([components count] > 1 && [(NSString *)[components objectAtIndex:0]
isEqualToString:@"myweb"]) {
if([(NSString *)[components objectAtIndex:1] isEqualToString:@"touch"]) {
//NSLog(@"you are touching!");
//NSTimeInterval delaytime = Delaytime;
[_timer invalidate];
_timer = nil;
_gesState = GESTURE_STATE_END;
if ([(NSString *)[components objectAtIndex:2] isEqualToString:@"start"]) {
/*
@需延时判断是否响应页面内的js...
*/
_gesState = GESTURE_STATE_START;
NSLog(@"touch start!");
float ptX = [[components objectAtIndex:3]floatValue];
float ptY = [[components objectAtIndex:4]floatValue];
NSLog(@"touch point (%f, %f)", ptX, ptY);
NSString *js = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).tagName", ptX, ptY];
NSString * tagName = [self.webview stringByEvaluatingJavaScriptFromString:js];
_imgURL = nil;
if ([tagName isEqualToString:@"IMG"]) {
_imgURL = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).src", ptX, ptY];
}
if (_imgURL) {
_timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(handleLongTouch) userInfo:nil repeats:NO];
_fangdaTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(fangdaClick) userInfo:nil repeats:NO];
}
}
else if ([(NSString *)[components objectAtIndex:2] isEqualToString:@"move"]) {
//**如果touch动作是滑动,则取消hanleLongTouch动作**//
_gesState = GESTURE_STATE_MOVE;
NSLog(@"you are move");
}
else if([(NSString *)[components objectAtIndex:2] isEqualToString:@"end"]) {
//**如果touch动作是滑动,则取消hanleLongTouch动作**//
_gesState = GESTURE_STATE_MOVE;
NSLog(@"touch end");
}
}
else if ([(NSString*)[components objectAtIndex:2]isEqualToString:@"end"]) {
[_timer invalidate];
_timer = nil;
_gesState = GESTURE_STATE_END;
NSLog(@"touch end");
}
return NO;
}
return YES;
}
#pragma mark - delegate
#pragma mark webview delegate
//这个方法是在上一个方法加载完成之后调用的方法
- (void)webViewDidFinishLoad:(UIWebView *)wb
{
NSLog(@"dabdjfbkjfbjebfjwekfbjhfjwkefbvkjbjkwfbkjvb3kjvbjvwbkjwkv3");
self.detailRecommendView.hidden = NO;
if (self.webkitTextSizeAdjust) {
//通过 javaScript 进行大小的控制
[wb stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust='%@%%'", self.webkitTextSizeAdjust]];
}
if ([DKNightVersionManager currentThemeVersion] == DKThemeVersionNight) {
[self.webview stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat: @"document.getElementsByTagName('body')[0].style.color = '#%@'", NightTextColorHexString]];
}
else {
[self.webview stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat: @"document.getElementsByTagName('body')[0].style.color = '#%@'", @"6d6d6d"]];
}
[self.webview stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat: @"document.getElementsByTagName('body')[0].style.webkitOverflowScrolling = 'touch'"]];
//
//标题
NSString * str = self.zhaiYaoLabel.text;
CGSize resultSize;
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineSpacing:pt(25)];//调整行间距
NSDictionary *attribute = @{NSFontAttributeName: self.zhaiYaoLabel.font,NSParagraphStyleAttributeName:paragraphStyle};
resultSize = [str boundingRectWithSize:CGSizeMake(ScreenWidth-50, 10000) options: NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attribute context:nil].size;
CGFloat height = resultSize.height;
// CGFloat height = [Utilities getTextHeight:str withSize:CGSizeMake(ScreenWidth-18, 10000) withFont:[UIFont systemFontOfSize:self.zhaiYaoLabel.font.pointSize]];
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:_zhaiYaoLabel.text];
NSLog(@"%@",attributedString);
// NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineSpacing:pt(20)];//调整行间距
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [_zhaiYaoLabel.text length])];
_zhaiYaoLabel.attributedText = attributedString;
//摘要
NSString * zhaiyaoStr = [NSString stringWithFormat:@"%@",self.zhaiYaoLabel.text.description];
if (zhaiyaoStr.length!=0) {
self.zhaoyaoView.frame = CGRectMake(0, CGRectGetMaxY(self.imageview.frame)+pt(24), ScreenWidth, height+30);
self.zhaiYaoLabel.frame = CGRectMake(25, 15, ScreenWidth-50, height);
}else {
self.zhaoyaoView.frame = CGRectMake(0, CGRectGetMaxY(self.imageview.frame)+pt(24), ScreenWidth, 0);
self.zhaiYaoLabel.frame = CGRectMake(25, 0, ScreenWidth-50, 0);
}
//方法1
CGRect frame = wb.frame;
frame.origin.x = 16;
frame.size.width = self.bounds.size.width-32;
frame.size.height = 1;
wb.frame = frame;
frame.size.height = wb.scrollView.contentSize.height;
if (zhaiyaoStr.length!=0) {
frame.origin.y = CGRectGetMaxY(self.zhaoyaoView.frame);
}else{
frame.origin.y = CGRectGetMaxY(self.zhaoyaoView.frame);
}
NSLog(@"frame = %@", [NSValue valueWithCGRect:frame]);
wb.frame = frame;
float webViewHight = frame.size.height+titleHight-30+2*height+pt(100);
NSArray *recommendArr = _detailObject.qiar;
float zanAndWatchHight = pt(80);
float detailAllEditorHight = pt(90);
float detailEditorHight = pt(204);
if ([_detailObject.authorinfo isKindOfClass:[NSArray class]]) {
detailEditorHight = 0.0;
self.detailEditorView.hidden = YES;
}
float detailADHight =((self.bounds.size.width*23)/64);
if ([_detailObject.adar isKindOfClass:[NSArray class]]||[Utilities isSimpleReadingMode]) {
detailADHight = 0.0;
self.detailADView.hidden = YES;
}
// float detailRecommendHight = (pt(28)*(recommendArr.count)+pt(32)*(recommendArr.count)+pt(24)+pt(28)+pt(24));
// float detailRecommendHight = recommendArr.count*80+30;
// if (recommendArr.count<1) {
// detailRecommendHight = 0.0;
// self.detailRecommendView.hidden = YES;
// }
float detailRecommendHight = 0.0;
float number = 0;
for (NSDictionary * dic in recommendArr) {
NSArray * array = [dic objectForKey:@"pics"];
if (array.count>2) {
number++;
}
detailRecommendHight = (142*number+80*(recommendArr.count-number)+pt(32)+pt(24));
}
if (!_previewHtml) {
// self.detailTitleView.rsDic = _detailObject.rs;
}
self.detailTitleView.rsDic = _detailObject.rs;
//
if (!_previewHtml) {
self.detailZanAndWatchView.frame = CGRectMake(0, webViewHight+zanAndWatchHight, self.bounds.size.width, zanAndWatchHight);
// self.detailZanAndWatchView.backgroundColor = COLOR_Red;
self.detailZanAndWatchView.rsDic = _detailObject.rs;
//
self.detailAllEditorView.frame = CGRectMake(0, webViewHight+zanAndWatchHight, self.bounds.size.width, detailAllEditorHight);
// self.detailAllEditorView.backgroundColor = COLOR_Red;
self.detailAllEditorView.picArr = @[@"dashang_face",@"dashang_face",@"dashang_face"];
//
self.detailEditorView.frame = CGRectMake(0, webViewHight+zanAndWatchHight+detailAllEditorHight, self.bounds.size.width, detailEditorHight);
if ([_detailObject.authorinfo isKindOfClass:[NSDictionary class]]) {
self.detailEditorView.editorDic = _detailObject.authorinfo;
}
//
self.detailADView.frame = CGRectMake(0, webViewHight+zanAndWatchHight+detailAllEditorHight+detailEditorHight, self.bounds.size.width, detailADHight);
if ([_detailObject.adar isKindOfClass:[NSDictionary class]]) {
self.detailADView.adDic = _detailObject.adar;
}
//
self.detailRecommendView.frame = CGRectMake(0, webViewHight+zanAndWatchHight+detailAllEditorHight+detailEditorHight+detailADHight, self.bounds.size.width, detailRecommendHight);
self.detailRecommendView.recommendArr = recommendArr;
}
_urlImageArray = [NSMutableArray array];
_picArray = [NSMutableArray array];
NSString *leng = [wb stringByEvaluatingJavaScriptFromString:@"var images = document.getElementsByTagName('img');images.length.toString();"];
NSLog(@"leng:%@",leng);
for (int i=0; i<[leng integerValue]; i++) {
NSString *strimage = [NSString stringWithFormat:@"var images = document.getElementsByTagName('img');images[%d].src;",i];
NSString *ImageUrl = [wb stringByEvaluatingJavaScriptFromString:strimage];
[_urlImageArray addObject:ImageUrl];
}
dispatch_async(dispatch_get_main_queue()
, ^{
for (NSString * url in _urlImageArray) {
NSURL *url1=[NSURL URLWithString:url];
NSURLRequest *request=[NSURLRequest requestWithURL:url1];
NSURLResponse *response=nil;
NSError *error=nil;
NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];//同步请求,可能会卡住
// NSMutableDictionary *allData = [ NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
NSLog(@"%@",[NSThread currentThread]);
UIImage * image = [UIImage imageWithData:data];
if (image) {
[_picArray addObject:image];
}
// [NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]] queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
// dispatch_async(dispatch_get_global_queue(0, 0), ^{
// NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
// NSLog(@"%@",[NSThread currentThread]);
// UIImage * image = [UIImage imageWithData:data];
// if (image) {
//
// [_picArray addObject:image];
// }
// });
// }];
}
});
//
self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width, webViewHight+zanAndWatchHight+detailAllEditorHight+detailEditorHight+detailADHight+detailRecommendHight+20);
// 响应touch事件,以及获得点击的坐标位置,用于保存图片
[wb stringByEvaluatingJavaScriptFromString:kTouchJavaScriptString];
}
问题是当点击图片返回详情页的时候会调用两次shouldStartLoadWithRequest:方法才能完成对触控的判断,中间这些时间是造成延迟的原因。