iOS 富文本編輯器-WKWebView

RichTextEditor

iOS 13 之后不再支持 UIWebView,所以將之前一篇文章iOS 富文本編輯器-UIWebView中 UIWebView 替換為 WKWebView腌乡。以下為更換到 WKWebView 的一些知識點(diǎn)铭腕。

富文本編輯器設(shè)計的知識點(diǎn)

Objective-C 語言調(diào)用 JavaScript 語言

通過WKWebView的

- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError * _Nullable error))completionHandler;

方法來實(shí)現(xiàn)的图云。這樣我們就可以實(shí)現(xiàn)文字的加粗、下劃線、斜體等等一切我們想要的樣式刺洒。

詳見項目中 WKWebView+VJJSTool 文件老翘。

JavaScript 語言調(diào)用 Objective-C 語言

第一步:我們需要在WKWebView創(chuàng)建的過程中初始化添加ScriptMessageHandler

WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
WKUserContentController *userController = [[WKUserContentController alloc] init];
configuration.userContentController = userController;
_mainWebView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, KMainWidth, KMainHeight) configuration:configuration];
[userController addScriptMessageHandler:self name:@"currentCookies"];

然后實(shí)現(xiàn)代理方法.監(jiān)聽JS的回調(diào).

//JS調(diào)用的OC回調(diào)方法
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
    
    if ([message.name isEqualToString:@"jsMethod"]) {
        //
    }
}

然后在Html文件中添加點(diǎn)擊方法.

<div id="button_div" onclick="buttonDivAction()">
      點(diǎn)擊調(diào)用OC方法
</div>

緊接著.在js文件中實(shí)現(xiàn)點(diǎn)擊事件.這時候要注意的是ScriptMessageHandler的名稱要與上面定義的一致.

function buttonDivAction() {
    window.webkit.messageHandlers. jsMethod.postMessage({
        "body": "buttonActionMessage"
    });
}

輸入文字時缅叠,插入符號位置計算

ZSSRichTextEditor.js

zss_editor.calculateEditorHeightWithCaretPosition = function() {}

新增標(biāo)題與副標(biāo)題

editor.html

<div id="vj_title">
     <input id="vj_article_title" maxlength="70" type="text" placeholder="請輸入標(biāo)題">
</div>
<div id="vj_abstract-title">
    <input id="vj_article_abstract" maxlength="35" type="text" placeholder="請輸入文章摘要">
</div>

去掉鍵盤自帶的工具條

WKWebView+HackishAccessoryHiding.h

@property (nonatomic, assign) BOOL hidesInputAccessoryView;

自動彈出鍵盤

實(shí)現(xiàn)和 UIWebView 中 keyboardDisplayRequiresUserAction 相同功能。即在 web 頁面 focus 獲得焦點(diǎn)狀態(tài)下彈出鍵盤臀脏,UIWebView 中 keyboardDisplayRequiresUserAction 設(shè)置為 NO 就可以實(shí)現(xiàn)劝堪,但是WKWebView 中沒有此屬性,可以通過以下方式實(shí)現(xiàn):

WKWebView+HackishAccessoryHiding.m

-(void)allowDisplayingKeyboardWithoutUserAction {
    Class class = NSClassFromString(@"WKContentView");
        NSOperatingSystemVersion iOS_11_3_0 = (NSOperatingSystemVersion){11, 3, 0};
        NSOperatingSystemVersion iOS_12_2_0 = (NSOperatingSystemVersion){12, 2, 0};
        NSOperatingSystemVersion iOS_13_0_0 = (NSOperatingSystemVersion){13, 0, 0};
        char * methodSignature = "_startAssistingNode:userIsInteracting:blurPreviousNode:changingActivityState:userObject:";

        if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion: iOS_13_0_0]) {
            methodSignature = "_elementDidFocus:userIsInteracting:blurPreviousNode:activityStateChanges:userObject:";
        } else if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion: iOS_12_2_0]) {
            methodSignature = "_elementDidFocus:userIsInteracting:blurPreviousNode:changingActivityState:userObject:";
        }

        if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion: iOS_11_3_0]) {
            SEL selector = sel_getUid(methodSignature);
            Method method = class_getInstanceMethod(class, selector);
            IMP original = method_getImplementation(method);
            IMP override = imp_implementationWithBlock(^void(id me, void* arg0, BOOL arg1, BOOL arg2, BOOL arg3, id arg4) {
                ((void (*)(id, SEL, void*, BOOL, BOOL, BOOL, id))original)(me, selector, arg0, TRUE, arg2, arg3, arg4);
            });
            method_setImplementation(method, override);
        } else {
            SEL selector = sel_getUid("_startAssistingNode:userIsInteracting:blurPreviousNode:userObject:");
            Method method = class_getInstanceMethod(class, selector);
            IMP original = method_getImplementation(method);
            IMP override = imp_implementationWithBlock(^void(id me, void* arg0, BOOL arg1, BOOL arg2, id arg3) {
                ((void (*)(id, SEL, void*, BOOL, BOOL, id))original)(me, selector, arg0, TRUE, arg2, arg3);
            });
            method_setImplementation(method, override);
        }

}

詳細(xì)代碼請看項目 https://github.com/Vergil-wj/RichTextEditor

參考資料:

ZSSRichTextEditor

WGEditor

淺談WKWebView使用揉稚、JS的交互

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秒啦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子搀玖,更是在濱河造成了極大的恐慌余境,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灌诅,死亡現(xiàn)場離奇詭異芳来,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)延塑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門绣张,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人关带,你說我怎么就攤上這事侥涵。” “怎么了宋雏?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵芜飘,是天一觀的道長。 經(jīng)常有香客問我磨总,道長嗦明,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任蚪燕,我火速辦了婚禮娶牌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘馆纳。我一直安慰自己诗良,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布鲁驶。 她就那樣靜靜地躺著鉴裹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上径荔,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天督禽,我揣著相機(jī)與錄音,去河邊找鬼总处。 笑死狈惫,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鹦马。 我是一名探鬼主播虱岂,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼菠红!你這毒婦竟也來了第岖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤试溯,失蹤者是張志新(化名)和其女友劉穎蔑滓,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遇绞,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡键袱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了摹闽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹄咖。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖付鹿,靈堂內(nèi)的尸體忽然破棺而出澜汤,到底是詐尸還是另有隱情,我是刑警寧澤舵匾,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布俊抵,位于F島的核電站,受9級特大地震影響坐梯,放射性物質(zhì)發(fā)生泄漏徽诲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一吵血、第九天 我趴在偏房一處隱蔽的房頂上張望谎替。 院中可真熱鬧,春花似錦蹋辅、人聲如沸钱贯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喷舀。三九已至,卻和暖如春淋肾,著一層夾襖步出監(jiān)牢的瞬間硫麻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工樊卓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拿愧,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓碌尔,卻偏偏與公主長得像浇辜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子唾戚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容