iOS自定義鍵盤實(shí)戰(zhàn)

iOS自定義鍵盤實(shí)戰(zhàn)

0x01 來龍去脈

github代碼下載 地址

在iOS8之前,iOS系統(tǒng)的輸入法只能使用蘋果官方提供的輸入法檩小。
對(duì)于中文來說浅妆,官方的輸入法并不好用穿仪,或者說不夠好用,詞庫框舔,聯(lián)想伴栓,云輸入等都沒有或者和搜狗輸入法,百度輸入法等有中國特色的輸入法相比有一定的差距雨饺。
部分用戶因?yàn)檩斎敕ǖ脑蚯澹x擇了安卓等其他系統(tǒng),或者選擇了越獄额港。
iOS自定義鍵盤是iOS8系統(tǒng)新推出的功能饺窿,允許開發(fā)者開發(fā)第三方鍵盤。眾人拾柴火焰高移斩,功能的開放肚医,為iOS用戶體驗(yàn)的提示必然帶來更大的推動(dòng)绢馍。

0x02 輸入法的基本結(jié)構(gòu)

輸入法的基本結(jié)構(gòu)

輸入法的項(xiàng)目可以使用普通的project模版,但是需要增加一個(gè)自定義鍵盤的Target肠套,所有的人機(jī)交互舰涌,都在項(xiàng)目生成的UIInputViewController一個(gè)子類里實(shí)現(xiàn)。關(guān)鍵的要素如下:

  • 一個(gè)Xcode的Project
  • 一個(gè)自定義鍵盤的Target
  • 一個(gè)UIInputViewController的子類
  • 必須提供一個(gè)明顯的切換到其他輸入法的按鈕

0x03 功能需求描述

  1. 鍵盤上提供一個(gè)按鈕你稚,點(diǎn)擊之后輸入“一支紅杏出墻來”

0x04 交互序列

交互序列

0x05 實(shí)現(xiàn)

0x0501. 建立一個(gè)單視圖的project

創(chuàng)建project

0x0502. 增加一個(gè)自定義鍵盤的target(Custom Keyboard)

創(chuàng)建鍵盤target

添加之后瓷耙,會(huì)看到有一個(gè)文件:KeyboardViewController,這是我們的主戰(zhàn)場

A1B535C54EB087327FFD1536F79556FF.png

0x0503. 編輯代碼

代碼的內(nèi)容很簡單刁赖,創(chuàng)建兩個(gè)按鈕搁痛,一個(gè)點(diǎn)擊之后,切換輸入法宇弛,一個(gè)點(diǎn)擊之后鸡典,向當(dāng)前輸入控件里添加”一枝紅杏出墻來"

//
//  KeyboardViewController.swift
//  keyboard
//
//  Created by qi on 15/12/3.
//  Copyright ? 2015年 im.windgo. All rights reserved.
//

import UIKit

class KeyboardViewController: UIInputViewController {

    @IBOutlet var nextKeyboardButton: UIButton! //切換輸入法
    @IBOutlet var yizhihongxingButton: UIButton! //輸入一支紅杏出墻來的按鈕
    override func updateViewConstraints() {
        super.updateViewConstraints()
    
        // Add custom view sizing constraints here
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    
        // Perform custom UI setup here
        
        //創(chuàng)建切換到另一個(gè)鍵盤的按鈕
        self.nextKeyboardButton = UIButton(type: .System)
        self.nextKeyboardButton.setTitle(NSLocalizedString("切換鍵盤", comment: "切換到下一個(gè)鍵盤的按鈕"), forState: .Normal)
        self.nextKeyboardButton.sizeToFit()
        self.nextKeyboardButton.translatesAutoresizingMaskIntoConstraints = false
        self.nextKeyboardButton.addTarget(self, action: "advanceToNextInputMode", forControlEvents: .TouchUpInside)
        self.view.addSubview(self.nextKeyboardButton)
        
        let nextKeyboardButtonLeftSideConstraint = NSLayoutConstraint(item: self.nextKeyboardButton, attribute: .Left, relatedBy: .Equal, toItem: self.view, attribute: .Left, multiplier: 1.0, constant: 0.0)
        let nextKeyboardButtonBottomConstraint = NSLayoutConstraint(item: self.nextKeyboardButton, attribute: .Bottom, relatedBy: .Equal, toItem: self.view, attribute: .Bottom, multiplier: 1.0, constant: 0.0)
        self.view.addConstraints([nextKeyboardButtonLeftSideConstraint, nextKeyboardButtonBottomConstraint])
        
        
        yizhihongxingButton=UIButton()
        yizhihongxingButton.backgroundColor=UIColor.magentaColor()
        yizhihongxingButton.setTitle("一支紅杏出墻來!", forState: UIControlState.Normal)
        yizhihongxingButton.frame=CGRectMake(0, 40, UIScreen.mainScreen().bounds.width, 100)
        yizhihongxingButton.addTarget(self, action: "onInputText", forControlEvents: UIControlEvents.TouchUpInside)
        self.view.addSubview(yizhihongxingButton)
        

    }
    

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated
    }

    override func textWillChange(textInput: UITextInput?) {
        // The app is about to change the document's contents. Perform any preparation here.
    }

    override func textDidChange(textInput: UITextInput?) {
        // The app has just changed the document's contents, the document context has been updated.
    
        var textColor: UIColor
        let proxy = self.textDocumentProxy
        if proxy.keyboardAppearance == UIKeyboardAppearance.Dark {
            textColor = UIColor.whiteColor()
        } else {
            textColor = UIColor.blackColor()
        }
        self.nextKeyboardButton.setTitleColor(textColor, forState: .Normal)
    }
    
    func onInputText(){
        self.textDocumentProxy.insertText("一支紅杏出墻來枪芒!")
    }


0x05004. 運(yùn)行代碼

  • 選擇運(yùn)行的target


    運(yùn)行鍵盤
  • 執(zhí)行會(huì)讓你選擇在哪個(gè)應(yīng)用里使用鍵盤彻况,選擇Safari瀏覽器就可以了


    選擇使用輸入法的app
  • 選擇地址欄,進(jìn)入輸入狀態(tài)舅踪,可以看到鍵盤疗垛,點(diǎn)擊會(huì)輸入“一支紅杏出墻來!”

最終運(yùn)行效果

注意:如果看不到鍵盤硫朦,可以切換下輸入法贷腕,如果輸入法里面沒有,需要到“設(shè)置”里面將鍵盤加入咬展。

更深入的技術(shù)細(xì)節(jié):英文好的可以看官方文檔
喜歡看中文的可以看翻譯官方文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末泽裳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子破婆,更是在濱河造成了極大的恐慌涮总,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,332評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祷舀,死亡現(xiàn)場離奇詭異瀑梗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)裳扯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門抛丽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饰豺,你說我怎么就攤上這事亿鲜。” “怎么了冤吨?”我有些...
    開封第一講書人閱讀 157,812評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵蒿柳,是天一觀的道長饶套。 經(jīng)常有香客問我,道長垒探,這世上最難降的妖魔是什么妓蛮? 我笑而不...
    開封第一講書人閱讀 56,607評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮圾叼,結(jié)果婚禮上蛤克,老公的妹妹穿的比我還像新娘。我一直安慰自己褐奥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,728評(píng)論 6 386
  • 文/花漫 我一把揭開白布翘簇。 她就那樣靜靜地躺著撬码,像睡著了一般。 火紅的嫁衣襯著肌膚如雪版保。 梳的紋絲不亂的頭發(fā)上呜笑,一...
    開封第一講書人閱讀 49,919評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音彻犁,去河邊找鬼叫胁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛汞幢,可吹牛的內(nèi)容都是我干的驼鹅。 我是一名探鬼主播,決...
    沈念sama閱讀 39,071評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼森篷,長吁一口氣:“原來是場噩夢啊……” “哼输钩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起仲智,我...
    開封第一講書人閱讀 37,802評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤买乃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后钓辆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剪验,經(jīng)...
    沈念sama閱讀 44,256評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,576評(píng)論 2 327
  • 正文 我和宋清朗相戀三年前联,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了功戚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,712評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡似嗤,死狀恐怖疫铜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情双谆,我是刑警寧澤壳咕,帶...
    沈念sama閱讀 34,389評(píng)論 4 332
  • 正文 年R本政府宣布席揽,位于F島的核電站,受9級(jí)特大地震影響谓厘,放射性物質(zhì)發(fā)生泄漏幌羞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,032評(píng)論 3 316
  • 文/蒙蒙 一竟稳、第九天 我趴在偏房一處隱蔽的房頂上張望属桦。 院中可真熱鬧,春花似錦他爸、人聲如沸聂宾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽系谐。三九已至,卻和暖如春讨跟,著一層夾襖步出監(jiān)牢的瞬間纪他,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評(píng)論 1 266
  • 我被黑心中介騙來泰國打工晾匠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茶袒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,473評(píng)論 2 360
  • 正文 我出身青樓凉馆,卻偏偏與公主長得像薪寓,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子澜共,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,606評(píng)論 2 350

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫预愤、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評(píng)論 4 62
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,834評(píng)論 25 707
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,339評(píng)論 7 249
  • 毛概課: 老師:怎么這么少人 全班:…… 老師:好销睁,下節(jié)課點(diǎn)名 紀(jì)律委員趕緊上微信群:各位同學(xué),老師大發(fā)慈悲存崖,說下...
    公子二超閱讀 458評(píng)論 0 1
  • 1.網(wǎng)頁亂碼的問題是如何產(chǎn)生的冻记?怎樣解決 先認(rèn)識(shí)認(rèn)識(shí)幾種編碼方式 ASCII 全稱美國標(biāo)準(zhǔn)信息交換代碼(Ameri...
    饑人谷_任磊閱讀 467評(píng)論 0 0