以后每用Runtime解決一個(gè)問(wèn)題潮罪,就會(huì)記錄在這個(gè)文集里。
我將以真實(shí)的使用場(chǎng)景為大家講述Runtime的各種用法,讓Runtime真正的投入到生產(chǎn)中盯滚。
合輯demo Github地址
問(wèn)題描述
給WKWebView做setContentOffset動(dòng)畫的方式有兩種踢械,一種是用setContentOffset:animated:,另一種是其他魄藕。
如果對(duì)動(dòng)畫效果有特殊的要求内列,那動(dòng)畫方式就只能選擇后者。而如果webView正好被選中而彈出了Menu泼疑,那問(wèn)題就比較曖昧了德绿。可以在滑動(dòng)的時(shí)候直接去掉Menu退渗,那問(wèn)題還比較簡(jiǎn)單移稳,但如果需要在滑動(dòng)結(jié)束后再恢復(fù)Menu,那問(wèn)題就尷尬了会油。另外个粱,如果這個(gè)地方不做特殊處理,Menu就會(huì)停留在原來(lái)的位置翻翩。
當(dāng)然都许,使用setContentOffset:animated:是沒(méi)這個(gè)問(wèn)題的。WKWebView會(huì)在內(nèi)部處理這種情況嫂冻。它會(huì)在動(dòng)畫開始的時(shí)候消失Menu胶征,在動(dòng)畫結(jié)束后再展示出Menu。
那怎么在使用自定義方法實(shí)現(xiàn)動(dòng)畫的同時(shí)又避免這個(gè)坑呢桨仿?我試著解決了這個(gè)問(wèn)題睛低。
問(wèn)題原因
其實(shí)解決這個(gè)問(wèn)題并沒(méi)有花多少時(shí)間,在之前我已經(jīng)對(duì)UIMenuController的底層實(shí)現(xiàn)比較了解服傍,所以我在Menu消失和出現(xiàn)的方法上下了斷點(diǎn)钱雷,很輕松的就找到了原因。
使用setContentOffset:animated:做動(dòng)畫吹零,會(huì)在開始動(dòng)畫的時(shí)候罩抗,給WKContentView發(fā)了_willStartScrollingOrZooming消息。在動(dòng)畫結(jié)束后又發(fā)了_didEndScrollingOrZooming消息灿椅。方法中實(shí)現(xiàn)了消失和展示Menu的相關(guān)邏輯套蒂。而用其他的方式做動(dòng)畫并沒(méi)有上訴流程。
解決方法
解決的辦法比較簡(jiǎn)單茫蛹,在自定義動(dòng)畫開始和結(jié)束時(shí)泣懊,也調(diào)一下這兩個(gè)方法,問(wèn)題就解決了麻惶。這兩個(gè)方法無(wú)參數(shù)也無(wú)返回值馍刮,比較干凈,可以放心調(diào)用窃蹋,代碼大概如下卡啰。
@implementation WKWebView (ScrollAnimateSupport)
[self.scrollView.subviews.firstObject performSelector:NSSelectorFromString(@"_didEndScrollingOrZooming")];
[self.scrollView.subviews.firstObject performSelector:NSSelectorFromString(@"_didEndScrollingOrZooming")];
@end