【iOS】WKWebView的 keyboardDisplayRequiresUserAction

情景描述

我們知道弯洗,UIWebView是有一個 keyboardDisplayRequiresUserAction屬性的,默認為YES岳掐。如果設置為YES伪嫁,用戶必須明確的點擊頁面上的元素或者相關聯(lián)的輸入頁面來顯示鍵盤;如果設置為NO西壮,一個元素的焦點事件導致輸入視圖的顯示和自動關聯(lián)這個元素遗增。

那么,如果我們加載一個Web頁面時款青,想一開始喚起鍵盤做修,除了web端需要設置input 的focus狀態(tài)外,我們還需要將keyboardDisplayRequiresUserAction設置為false

問題

然而抡草,WKWebView是沒有這個屬性的饰及,但又想做到以上效果,怎么辦呢康震?只能通過runtime處理了旋炒,以下是收集Stack Overflow的方法

OC版本

#import <objc/runtime.h>

@implementation WebViewInjection

+ (void)allowDisplayingKeyboardWithoutUserAction {
    Class class = NSClassFromString(@"WKContentView");
    NSOperatingSystemVersion iOS_11_3_0 = (NSOperatingSystemVersion){11, 3, 0};

    if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion: iOS_11_3_0]) {
        SEL selector = sel_getUid("_startAssistingNode:userIsInteracting:blurPreviousNode:changingActivityState: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, 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);
    }
}

@end

Swift版本

typealias OlderClosureType =  @convention(c) (Any, Selector, UnsafeRawPointer, Bool, Bool, Any?) -> Void
typealias NewerClosureType =  @convention(c) (Any, Selector, UnsafeRawPointer, Bool, Bool, Bool, Any?) -> Void

extension WKWebView{

    var keyboardDisplayRequiresUserAction: Bool? {
        get {
            return self.keyboardDisplayRequiresUserAction
        }
        set {
            self.setKeyboardRequiresUserInteraction(newValue ?? true)
        }
    }

    func setKeyboardRequiresUserInteraction( _ value: Bool) {

        guard
            let WKContentViewClass: AnyClass = NSClassFromString("WKContentView") else {
                print("Cannot find the WKContentView class")
                return
        }

        let olderSelector: Selector = sel_getUid("_startAssistingNode:userIsInteracting:blurPreviousNode:userObject:")
        let newerSelector: Selector = sel_getUid("_startAssistingNode:userIsInteracting:blurPreviousNode:changingActivityState:userObject:")

        if let method = class_getInstanceMethod(WKContentViewClass, olderSelector) {

            let originalImp: IMP = method_getImplementation(method)
            let original: OlderClosureType = unsafeBitCast(originalImp, to: OlderClosureType.self)
            let block : @convention(block) (Any, UnsafeRawPointer, Bool, Bool, Any?) -> Void = { (me, arg0, arg1, arg2, arg3) in
                original(me, olderSelector, arg0, !value, arg2, arg3)
            }
            let imp: IMP = imp_implementationWithBlock(block)
            method_setImplementation(method, imp)
        }

        if let method = class_getInstanceMethod(WKContentViewClass, newerSelector) {

            let originalImp: IMP = method_getImplementation(method)
            let original: NewerClosureType = unsafeBitCast(originalImp, to: NewerClosureType.self)
            let block : @convention(block) (Any, UnsafeRawPointer, Bool, Bool, Bool, Any?) -> Void = { (me, arg0, arg1, arg2, arg3, arg4) in
                original(me, newerSelector, arg0, !value, arg2, arg3, arg4)
            }
            let imp: IMP = imp_implementationWithBlock(block)
            method_setImplementation(method, imp)
        }

    }

}

原文地址

https://stackoverflow.com/questions/32449870/programmatically-focus-on-a-form-in-a-webview-wkwebview

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市签杈,隨后出現(xiàn)的幾起案子瘫镇,更是在濱河造成了極大的恐慌鼎兽,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铣除,死亡現(xiàn)場離奇詭異谚咬,居然都是意外死亡,警方通過查閱死者的電腦和手機尚粘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門择卦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人郎嫁,你說我怎么就攤上這事秉继。” “怎么了泽铛?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵尚辑,是天一觀的道長。 經(jīng)常有香客問我盔腔,道長杠茬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任弛随,我火速辦了婚禮瓢喉,結果婚禮上,老公的妹妹穿的比我還像新娘舀透。我一直安慰自己栓票,他們只是感情好,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布愕够。 她就那樣靜靜地躺著走贪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪链烈。 梳的紋絲不亂的頭發(fā)上厉斟,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音强衡,去河邊找鬼擦秽。 笑死,一個胖子當著我的面吹牛漩勤,可吹牛的內(nèi)容都是我干的感挥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼越败,長吁一口氣:“原來是場噩夢啊……” “哼触幼!你這毒婦竟也來了?” 一聲冷哼從身側響起究飞,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤置谦,失蹤者是張志新(化名)和其女友劉穎堂鲤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體媒峡,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡瘟栖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了谅阿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片半哟。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖签餐,靈堂內(nèi)的尸體忽然破棺而出寓涨,到底是詐尸還是另有隱情,我是刑警寧澤氯檐,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布戒良,位于F島的核電站,受9級特大地震影響男摧,放射性物質(zhì)發(fā)生泄漏蔬墩。R本人自食惡果不足惜译打,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一耗拓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奏司,春花似錦乔询、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至搪缨,卻和暖如春食拜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背副编。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工负甸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痹届。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓呻待,卻偏偏與公主長得像,于是被迫代替她去往敵國和親队腐。 傳聞我的和親對象是個殘疾皇子蚕捉,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

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

  • 今天是很開心的一天迫淹,因為學校組織了這個素質(zhì)擴展活動秘通,對于這這個學校真的待悶了,所以能出去玩一天是很開心的敛熬,給我了我...
    大雄老師will閱讀 235評論 0 0
  • google 這是一個普通段落充易。 Foo Foo 這是另一個普通段落。
    tfans2017閱讀 366評論 0 0
  • 某天在微博上看到一個評論荸型,我覺得用來形容我心目中的你再貼切不過了:“我曾經(jīng)見過一個最會做夢卻也最務實的少年盹靴。自此以...
    Echo麗閱讀 556評論 0 4