【西藏纪】愿你有天,也能为协调踏新加坡外(2)

by admin on 2018年12月28日

UIWebView学习笔记

和自己在突阿拉木图城的路口走一走

直至所有的灯都流失了也不滞留

1. iOS 禁用webView加载网页的长按现身’拷贝’事件

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [self.webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
    [self.webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
}

车上播着赵雷的【西雅图】,我们离开了伊斯兰堡。

2. iOS webView长按图片,不出新’拷贝’(iOS9默认就是这种效果)

【路易港-泸定桥-康定-新都桥-雅江-理塘-香格里拉镇】

2.1 准备好JS文件

// js文件,如:acepack_details.js
function setImageClickFunction(){
    var imgs = document.getElementsByTagName("img");
    for (var i=0;i<imgs.length;i++){
        imgs[i].style.webkitUserSelect='none';
    }
}

【泸定桥】

长途跋涉,平素到夜幕7点左右,我们才终于到了泸定桥。是不是认为怎么7点天还这么亮?这边的日落很晚,七点多或者中午四五点的样子,白天长得感觉特别够用。

近年来我们站着的泸定桥已经由此了巩固,铁锁上铺了厚厚的木板。但总归是铁索桥,走在下边一晃一晃的,加上木板是雕刻的,好像踩错地方随时会掉下去的感觉。很难想象这时红军是如何忙碌爬过这条桥的。当然,现在也有一对有关泸定桥战役夸大的通讯,这个在此处不作深究。

这张图是没p过的,下面东江的河水确实清澈得令人着迷。车上多少个男生起初yy在水里畅游一公里的场景。

照完游客照,我们都疯了一般奔向邻近的粉面店,要驾驭我们从中午7点多吃完早饭,到前几日时隔12时辰都没吃过正餐。一家粉面店弹指间被大家占领了。司机表哥多多直接就拿起炊具为大家炒了个蛋炒饭,抛锅特熟习,像个大厨一样。原来她是友善开了个馆子,客人多的时候就协调下去耍两手。有单子了就发车带着游客天南地北地闯,对于她的话,司机并不是一个职业,而是喜欢和野趣。他有各样赏心悦目的中途经验,大家都听得津津入味。

各种人都有自己的生活模式,而我辈大部分的人,都是上班下班,拿着随便养不养得起协调的工薪,重复着平淡的光阴。很五人应接不暇地赚钱,就是为着过更好的生活,但往往,钱有了,生活却没了。我总特别羡慕这个过着新鲜生活的人,或是把喜欢融入到工作中的人。例如我的带队,他们就是几个爱好游山玩水的伴儿凑在一起开了个户外,每年就用赚了的钱到世界各地旅游。路上我一向在想,大家所敬仰的活着,到底是怎么样的呢?

2.2 注入JS

[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"acepack_details" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil]];

【新都桥】

新都桥是举世知名的拍摄天堂,我直接以为它是一个景色,后日才了解原来是沿路的山水。先给你们看个天路18弯。

沿路都是景点,天空蓝得像调色板调出来的相同。现在是万物等待恢复的时令,给人的感觉到有些冷冷清清,植被多数是黄黄的一片。

沿途会映入眼帘成群结队的牦牛出来吃草。它们不但在坝子吃,也会一头头挂在山头,远远望去,山上会有一坨坨黑色的点点,很诧异这么陡的坡,它们究竟是怎么爬上去的。它们就是此处的霸主,慢悠悠地走在途中,完全不怕车来。

嘿嘿那里教教我们数牦牛,不是一只五只两只这样数,而是一万两万三万这么数,假若把人家的牦牛撞死了,价格每头就从一万化为两万了。领队毛哥说,倘诺见到牦牛的所有者,一定要找他加微信,因为养牦牛的就是不是亿万富翁都是富家。

打卡海波4700米

俺们的车开到一半,备胎掉路上了,但我们都没察觉。在大家后车的是一个独龙族的僧人,见到我们备胎掉了,就停车帮我们把备胎放在路边,然后追上我们到观景台让大家回来取。路上好人依然广大的。可惜当我们回到找到这备胎的时候,它已经碰坏了。

3. webView作为tableView的tableHeaderView

  • 在webView的回调方法里,一定要重新设置tableView的tableHeaderView,否则会冒出意外的题材。

-(void)webViewDidFinishLoad:(UIWebView *)webView {
    // 获取到webview的高度
    CGFloat height = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"] floatValue];
    self.webView.frame = CGRectMake(self.webView.frame.origin.x, self.webView.frame.origin.y, ScreenWidth, height);
    // 一定要重新设置tableView的tableHeaderView,否则会出现意想不到的问题。
    [self tableView].tableHeaderView = self.webView;
}

【天路】

开到天路,当然不可不拍张全世界都是自己的觉得的照片。平常在网上看见人家压马路,都觉得特帅。看见公路一路无界限地延长,就像我们的人生,一贯走,看不见尽头。

因为来的途中,平素都尚未高原反应,我觉着自己一度克服了,于是跳了两张,毛哥是趴在地上用生命帮自己拍的照,照出来的觉得跳得可高了。

拍照不易:毛哥趴在地上,我跳了一点次

顶尖无敌喜欢这张

于是问题来了,跳完之后大概半钟头,感冒欲裂,我了解自己高反了,真的完美地诠释了这句话:no
zuo no die。

进藏小tips

因为高原气压问题,我们带入的东西都有挤喷和自爆的场所。假设带像薯片这样的暴涨食品,在途中就会鼓得“嘭嘭”地自爆了。看到我右侧的洗面奶了啊?变成了个小胖墩,只要一打开盖子,洗面奶就会融洽源源不断流出来。我有一个小伙伴,画眼线画到一半眼线液立刻喷到随身把白色的羽绒报废了;另一个小伙伴是所有膏状物质一打开,都间接喷了出去。所以指出大家带像自己图片右侧的玻璃瓶,不要带胶质的,就不会有这种场地。

初到高原地区必将毫无洗澡!不要洗澡!不要洗澡!首要的业务说五回。因为洗澡扩展血液循环,容易造成供氧不足,加上浴室里的蒸汽容易令人缺氧,就很容易出现高反了。我的室友原本没事的,于是没听领队的交代,洗完澡就头晕呕吐整晚睡糟糕了。

为了给人体补给能量,可以带上葡萄糖粉和西洋参片,天天把这多少个充实热水里泡着喝,亲测有效。

未完待续……

4. 替换webView中的img标签的图片

  • 采纳场景
    • 得到页面中装有图片,图片浏览器
    • 非WIFI环境下,加载本地图片

- (NSString *)replaceImageUrl:(NSString *) content {
    // 匹配<img>标签
    NSString *urlPattern = @"<img[^>]+?src=[\"']?([^>'\"]+)[\"']?";
    NSError *error = [NSError new];
    NSString *tmp = content;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:urlPattern options:NSRegularExpressionCaseInsensitive error:&error ];
    // match 这块内容非常强大
    NSUInteger count =[regex numberOfMatchesInString:content options:NSRegularExpressionCaseInsensitive range:NSMakeRange(0, [content length])];// 匹配到的次数
    UIImage *img = [UIImage imageNamed:@"icon_app"];
    // 用网络图片替换webView上显示的图片
    NSString *tmpStr = @"https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white_fe6da1ec.png";
    // 用本地图片替换webView上显示的图片
    tmpStr = [self htmlForJPGImage:img];
    if(count > 0) {
        NSArray* matches = [regex matchesInString:content options:NSMatchingReportCompletion range:NSMakeRange(0, [content length])];
        for (NSTextCheckingResult *match in matches) {
            NSInteger count = [match numberOfRanges]; // 匹配项
            for(NSInteger index = 0;index < count;index++){
                NSRange halfRange = [match rangeAtIndex:index];
                if (index == 1) {
                    // 图片的src属性值
                    NSString *urlStr = [content substringWithRange:halfRange];
                    NSLog(@"=%@=",urlStr);
                    // 保存图片URL
                    [self.imgSrcArrayM addObject:[content substringWithRange:halfRange]];
                    // 替换src属性值
                    tmp = [tmp stringByReplacingOccurrencesOfString:urlStr withString: tmpStr];
                }
            }
        }
    }
    return tmp;
}

// 编码图片
- (NSString *)htmlForJPGImage:(UIImage *)image {
    NSData *imageData = UIImageJPEGRepresentation(image,1.0);
    NSString *imageSource = [NSString stringWithFormat:@"data:image/jpg;base64,%@",[imageData base64Encoding]];
    return imageSource;
}

5. webView注入JS代码

[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"acepack_details" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil]];

6. webView执行JS代码

// 调用JS里的setImageClickFunction()函数
[self.webView stringByEvaluatingJavaScriptFromString:@"setImageClickFunction()"];

7. webView中的图片点击事件

7.1 准备好JS文件

// js文件,如:acepack_details.js
function setImageClickFunction(){
    // 取出所有的img标签
    var imgs = document.getElementsByTagName("img");
    for (var i=0;i<imgs.length;i++){
        var src = imgs[i].src;
        // 绑定事件
        imgs[i].setAttribute("onClick","clickme(src)");
    }
}

function clickme(imagesrc){
    var url="ClickImage:"+imagesrc;
    document.location = url;
}

7.2 注入JS

[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"acepack_details" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil]];

7.3 webView请求回调里,执行JS

// 调用JS里的setImageClickFunction()函数
[self.webView stringByEvaluatingJavaScriptFromString:@"setImageClickFunction()"];

7.4 拦截请求,处理图片的单击事件

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)_request navigationType:(UIWebViewNavigationType)navigationType {
    NSString *requestString = [[_request URL] absoluteString];
    NSString *prefix = @"clickimage:";
    if ([requestString hasPrefix:prefix]) {
        DDLogVerbose(@"%@", requestString);
        NSUInteger index = 0;
        NSRange range = [requestString rangeOfString:prefix];
        if (range.location != NSNotFound) {
            NSString *tmpSrc = [requestString substringFromIndex:(range.location + range.length)];
            index = [self.imgSrcArrayM indexOfObject:tmpSrc];
        }
        // 显示图片浏览器
        [self networkImageShow:index];
    }
    return YES;
}

8. 长按webView上的图片,保存

8.1 注入JS

static NSString* const kTouchJavaScriptString=
@"document.ontouchstart=function(event){\
x=event.targetTouches[0].clientX;\
y=event.targetTouches[0].clientY;\
document.location=\"myweb:touch:start:\"+x+\":\"+y;};\
document.ontouchmove=function(event){\
x=event.targetTouches[0].clientX;\
y=event.targetTouches[0].clientY;\
document.location=\"myweb:touch:move:\"+x+\":\"+y;};\
document.ontouchcancel=function(event){\
document.location=\"myweb:touch:cancel\";};\
document.ontouchend=function(event){\
document.location=\"myweb:touch:end\";};";
[self.webView stringByEvaluatingJavaScriptFromString:kTouchJavaScriptString];

8.2 处理点击UIWebView下面的图形

#pragma mark - 处理点击UIWebView上面的图片
- (BOOL)handleWebViewClickImageWithUrl:(NSString *)url{
    NSString *requestString = url;
    NSArray *components = [requestString componentsSeparatedByString:@":"];
    if ([components count] > 1 && [(NSString *)[components objectAtIndex:0]
                                   isEqualToString:@"myweb"]) {
        if([(NSString *)[components objectAtIndex:1] isEqualToString:@"touch"]) {
            //NSLog(@"you are touching!");
            //NSTimeInterval delaytime = Delaytime;
            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];
                }
            }
            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"]) {
                [_timer invalidate];
                _timer = nil;
                _gesState = GESTURE_STATE_END;
                NSLog(@"touch end");
            }
        }
        return NO;
    }
    return YES;
}
// 处理长按事件
- (void)handleLongTouch {
    NSLog(@"%@", _imgURL);
    if (_imgURL && _gesState == GESTURE_STATE_START) {
        UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"保存图片", nil];
        sheet.cancelButtonIndex = sheet.numberOfButtons - 1;
        [sheet showInView:[UIApplication sharedApplication].keyWindow];
    }
}
// 弹出对话框
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (actionSheet.numberOfButtons - 1 == buttonIndex) return;
    NSString *title = [actionSheet buttonTitleAtIndex:buttonIndex];
    if ([title isEqualToString:@"保存图片"]) {
        if (_imgURL) {
            NSLog(@"imgurl = %@", _imgURL);
        }
        NSString *urlToSave = [self.webView stringByEvaluatingJavaScriptFromString:_imgURL];
        NSLog(@"image url=%@", urlToSave);
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlToSave]];
        UIImage *image = [UIImage imageWithData:data];
        UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
    }
}
// 回调
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
    if (error) {
        NSLog(@"Error");
    } else {
        NSLog(@"OK");
    }
}

9. webView缓存

9.1 缓存的意义

  1. webView一般是加载UI相比较复杂绚丽、可变、iOS原生控件不便于实现的界面,所以网页的因素一般都很复杂,对地处GPRS环境下的用户而言,流量是个大题材,所以需要缓存!
  2. 当用户处于断网状态下时,为了防止用户进入空白页面,应该把上次一度加载过的页面展现给用户!
  3. webView的伸手一般都是GET,POST请求一般是发大量数据给服务器处理(变动性相比较大),因而一般只对GET请求举行缓存,而不对POST请求举办缓存。

9.2 为啥可以开展缓存?

  • NSURLCache在每个UIWebView的的NSURLRequest请求中都会被调用。
  • iOS 5在此之前:只帮助内存缓存;从iOS 5起先:同时援助内存缓存和硬盘缓存。

9.3 怎么形成缓存?

  • iOS设备上NSURLCache默认只可以举行内存缓存。可以由此子类化NSURLCache来实现自定义的版本从而实现在DISK上缓存内容。
  • 亟待重写cachedResponseForRequest,这个会在伸手发送前会被调用,从中我们能够判明是否对准此NSURLRequest再次来到本地数据。
  • 若果当地没有缓存就调用下面这条语句:return [super cachedResponseForRequest:request];

9.4 NSURLCache常用艺术

  1. 全局缓存对象

NSURLCache *cache = [NSURLCache sharedURLCache]; 
  1. 安装内存缓存的最大容量(字节为单位,默认为512KB)

-(void)setMemoryCapacity:(NSUInteger)memoryCapacity;
  1. 安装硬盘缓存的最大容量(字节为单位,默认为10M)

-(void)setDiskCapacity:(NSUInteger)diskCapacity;
  1. 收获某个请求的缓存

-(NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request; ```
5. 清除某个请求的缓存
``` objc
-(void)removeCachedResponseForRequest:(NSURLRequest *)request;
  1. 消除所有的缓存

-(void)removeAllCachedResponses;

9.5 设置NSURLRequest缓存策略

  • NSURLRequestUseProtocolCachePolicy // 默认的缓存策略(取决于情商)
  • NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求
  • NSURLRequestReloadIgnoringLocalAndRemoteCacheData // 未实现
  • NSURLRequestReloadIgnoringCacheData =
    NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求
  • NSURLRequestReturnCacheDataElseLoad //
    有缓存就用缓存,没有缓存就再度请求
  • NSURLRequestReturnCacheDataDontLoad //
    有缓存就用缓存,没有缓存就不发请求,当做请求出错处理(用于离线情势)
  • NSURLRequestReloadRevalidatingCacheData // 未实现

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图