加載網(wǎng)頁時(shí),有時(shí)候產(chǎn)品經(jīng)理會(huì)提出一個(gè)需求:點(diǎn)擊界面的圖片,可以進(jìn)行查看大圖操作。下面說下我的實(shí)現(xiàn)思路:
給 UIWebView 添加 tap手勢 ,利用手勢的代理方法
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch可以獲取到手指點(diǎn)擊觸點(diǎn)在界面的位置,再使用
JS可以獲取到該點(diǎn)顯示的元素,這樣就可以獲取到img標(biāo)簽,拿到圖片的地址。但是,這個(gè)方法是只要有手勢就會(huì)響應(yīng),也就是說,只要你的手指在界面上面移動(dòng)就會(huì)觸發(fā),如果說,這個(gè)時(shí)候你就將拿到的圖片地址用來顯示,就會(huì)出現(xiàn)在滑動(dòng)的過程中展示大圖,這個(gè)效果肯定是不符合交互過程的。那么使用這個(gè)方法我們能夠做什么呢?明顯的是,我們可以拿到圖片的鏈接,但是這個(gè)方法調(diào)用的頻率很高,這里需要過濾-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) { if (gestureRecognizer == self.af_customTap) { CGPoint touchPoint = [touch locationInView:self]; NSString *imgURL = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).src", touchPoint.x, touchPoint.y]; NSString *URLString = [self stringByEvaluatingjavaScriptFromString:imgURL]; self.af_isClickImage = @(NO); if (URLString && URLString.length > 0) { self.af_isClickImage = @(YES); self.af_imageString = URLString; } } } return YES;}這個(gè)過濾可以做到拿到最近的圖片的地址,簡單來說就是拿到我們想要顯示的圖片的地址,那么現(xiàn)在的問題就是顯示圖片的時(shí)機(jī)。這個(gè)方法的任務(wù)已經(jīng)完成了,所以我就再次去
UIGestureRecognizerDelegate找有有關(guān)的代理方法,發(fā)現(xiàn)只有在這個(gè)-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;
方法中做文章了,沒錯(cuò)就是在這個(gè)方法中實(shí)現(xiàn)回調(diào)。具體的代碼也十分簡單,注意這里我們返回的是 NO 因?yàn)槲覀兪褂眠@個(gè)手勢,實(shí)質(zhì)上面是獲取手指在界面上面滑動(dòng)獲取位置,并不是需要添加手勢事件。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{ if (gestureRecognizer == self.af_customTap) { if (self.af_imageString && [self.af_isClickImage boolValue]) { !self.af_clickImage ? : self.af_clickImage(self.af_imageString); self.af_imageString = nil; } return NO; /// 這里返回 NO 不需要響應(yīng)手勢 } return YES;}現(xiàn)在我們看看頭文件的內(nèi)容:/// 點(diǎn)擊圖片回調(diào) 返回被點(diǎn)擊圖片的地址字符串-(void)af_didClickImageCall:(void(^)(NSString* URLString)) clickImage;就是需要的獲取
webView中的圖片時(shí),使用這個(gè)方法,回調(diào)的Block會(huì)將對應(yīng)的圖片地址給你。這個(gè)回調(diào)方法中寫展示大圖的邏輯;完整的代碼我會(huì)上傳我的github,前面的博客中有地址,大家也可以聯(lián)系我,直接發(fā)給你。微博:哈嘍ExpecT、QQ:1156154406、微信:hmh5896...存在的不足:實(shí)現(xiàn)上面是添加了一個(gè)
tap手勢(這個(gè)手勢不會(huì)影響webView原有手勢的響應(yīng)),但是,對于web頁面的所有圖片都會(huì)有回調(diào),可能在某些使用場景下需要過濾一些圖片,例如頭像之類的小圖片。這個(gè)還需要使用者自己修改相關(guān)的JS代碼,過濾網(wǎng)頁的某些圖片標(biāo)簽。或者,拿到圖片地址之后做相應(yīng)的過濾操作。
新聞熱點(diǎn)
疑難解答
圖片精選