UIScrollView上的Webview不能立即滑动

新手上路,请多包涵

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:方法才能完成对触控的判断,中间这些时间是造成延迟的原因。

阅读 3.5k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题