選擇放這張效果圖的時(shí)候很是忐忑啊,不知道會(huì)不會(huì)被和諧掉。
拿到需求之后分析了一下逃顶,其實(shí)主要功能點(diǎn)就是如何才能通過手指按壓位置獲取到相應(yīng)的圖片資源。是不是很抓狂麻裳,如果考慮到設(shè)備適配口蝠,誰(shuí)知道手指按在什么地方了器钟。
直接google查到了下面的這兩行代碼津坑,然后跑到H5大哥那請(qǐng)教,給我實(shí)際演示了一下傲霸,發(fā)現(xiàn)能夠完美解決上面的問題疆瑰。
NSString *imgURL = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).src", touchPoint.x, touchPoint.y];
NSString *urlToSave = [self.webView stringByEvaluatingJavaScriptFromString:imgURL];
整篇文章的精髓就全在上面的那兩行代碼里了,接下來我就把完整的實(shí)現(xiàn)代碼放上來昙啄。
首先是給UiWebView加一個(gè)長(zhǎng)按手勢(shì)穆役。
UILongPressGestureRecognizer* longPressed = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressed:)];
longPressed.delegate = self;
[self.webView addGestureRecognizer:longPressed];
接著在手勢(shì)響應(yīng)方法里面實(shí)現(xiàn)相應(yīng)的獲取圖片地址的方法,并彈出SheetView梳凛。這里需要注意的是一定要判斷手勢(shì)的state屬性耿币,想知道后果的同學(xué)可以注掉判斷代碼自己嘗試一下。另外就是如果手指長(zhǎng)按位置是非圖片的話韧拒,urlToSave是一個(gè)nil值淹接。
- (void)longPressed:(UILongPressGestureRecognizer*)recognizer
{
if (recognizer.state != UIGestureRecognizerStateBegan) {
return;
}
CGPoint touchPoint = [recognizer locationInView:self.webView];
NSString *imgURL = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).src", touchPoint.x, touchPoint.y];
NSString *urlToSave = [self.webView stringByEvaluatingJavaScriptFromString:imgURL];
if (urlToSave.length == 0) {
return;
}
[self showImageOptionsWithUrl:urlToSave];
}
接下來的方法是調(diào)用一個(gè)自己封裝好的SheetVIew,大家完全可以跳過叛溢,列出來只是為了不破壞代碼的連貫性塑悼。
- (void)showImageOptionsWithUrl:(NSString *)imageUrl
{
RAActionCustomButton *saveBtn = [[RAActionCustomButton alloc] init];
saveBtn.type = kRAActionCustomButtonTypeSheetWhite;
[saveBtn setTitle:@"保存圖片" forState:UIControlStateNormal];
saveBtn.touchUpInsideBlock = ^(RAActionCustomButton *btn){
[self saveImageToDiskWithUrl:imageUrl];
};
RAActionCustomButton *cancelBtn = [[RAActionCustomButton alloc] init];
cancelBtn.type = kRAActionCustomButtonTypeSheetWhite;
[cancelBtn setTitle:@"取消" forState:UIControlStateNormal];
cancelBtn.touchUpInsideBlock = ^(RAActionCustomButton *btn){
};
RAActionSheet *sheet = [[RAActionSheet alloc] init];
sheet.actionBtns = @[ saveBtn, cancelBtn];
[sheet show];
}
最后就是請(qǐng)求圖片并保存到相冊(cè)的方法。這里需要注意一下cachePolicy這個(gè)參數(shù)楷掉,當(dāng)前選擇的參數(shù)含義是只有在cache中不存在data時(shí)才從原始地址下載厢蒜。在實(shí)現(xiàn)過程中大家可以根據(jù)實(shí)際的功能需求來選擇不同的參數(shù)。
- (void)saveImageToDiskWithUrl:(NSString *)imageUrl
{
NSURL *url = [NSURL URLWithString:imageUrl];
NSURLSessionConfiguration * configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue new]];
NSURLRequest *imgRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30.0];
NSURLSessionDownloadTask *task = [session downloadTaskWithRequest:imgRequest completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
return ;
}
NSData * imageData = [NSData dataWithContentsOfURL:location];
dispatch_async(dispatch_get_main_queue(), ^{
UIImage * image = [UIImage imageWithData:imageData];
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
});
}];
[task resume];
}
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
if (error) {
[[RAProgressHUD sharedHUD] showErrorWithMessage:@"保存失敗"];
}else{
[[RAProgressHUD sharedHUD] showSuccessWithMessage:@"保存成功"];
}
}
功能實(shí)現(xiàn)代碼已經(jīng)完整的貼出來了烹植,接下來聊一些文章之外的事情斑鸦。首先感謝大家對(duì)我的支持,尤其是上一篇文章iOS雷達(dá)圖 iOS RadarChart實(shí)現(xiàn)草雕,不過讓人哭笑不得的是大家要demo的方式有一種向老司機(jī)要種子的既視感??巷屿。沒有及時(shí)放上demo是我偷懶了,我會(huì)馬上更新的促绵。另外要特別感謝給我打賞的那位攒庵,感謝你對(duì)我的認(rèn)可嘴纺,真是讓我受寵若驚,我的文章竟然值錢咧浓冒。
再有就是我的文章都是在簡(jiǎn)書上面寫的栽渴,所以大家有什么問題還是最好到原文章下面來討論(尤其是要demo),不然我是看不到的稳懒,而且有些網(wǎng)站在轉(zhuǎn)載的時(shí)候連排版都不會(huì)檢查一下闲擦,真的很讓人頭疼。
如果你覺得這篇文章多多少少幫助到了你一些场梆,打賞倒是不用墅冷,點(diǎn)個(gè)關(guān)注加喜歡吧,謝謝大家的認(rèn)可或油。