深入講解iOS鍵盤(pán)三:自定義鍵盤(pán)的兩種方法

iOS系統(tǒng)提供了多種鍵盤(pán)阱州,我們可以通過(guò)Enum類(lèi)型設(shè)置。但有的時(shí)候由于某些特殊業(yè)務(wù)的需要勋拟,我們不得不自定義鍵盤(pán)勋磕,比如某些銀行的APP處于安全考慮,他們鍵盤(pán)數(shù)字的位置是隨機(jī)的敢靡,這個(gè)時(shí)候只能自定義鍵盤(pán)挂滓。幸運(yùn)的是,iOS也為我們提供了多種方式自定義鍵盤(pán)醋安。我們可以根據(jù)自身情況選擇合適的方案杂彭。

typedef?NS_ENUM(NSInteger,?UIKeyboardType)?{

????UIKeyboardTypeDefault,

????UIKeyboardTypeASCIICapable,?can?enter?ASCII?characters

????UIKeyboardTypeNumbersAndPunctuation,

????UIKeyboardTypeURL,

????UIKeyboardTypeNumberPad,

????UIKeyboardTypePhonePad,

????UIKeyboardTypeNamePhonePad,

????UIKeyboardTypeEmailAddress,

????UIKeyboardTypeDecimalPad?,

????UIKeyboardTypeTwitter?,

????UIKeyboardTypeWebSearch?,

????UIKeyboardTypeASCIICapableNumberPad?,

????UIKeyboardTypeAlphabet?=?UIKeyboardTypeASCIICapable,

};

對(duì)現(xiàn)有鍵盤(pán)稍加改動(dòng)

這種情況適合身份證的輸入墓毒。由于身份證大部分情況下都是數(shù)字吓揪,偶爾可能出現(xiàn)“X”字符,如果我們棄用數(shù)字鍵盤(pán)直接使用諸如UIKeyboardTypeNumbersAndPunctuation等包含數(shù)字和字符的鍵盤(pán)又顯得沒(méi)有太大必要所计,那稍加改動(dòng)數(shù)字鍵盤(pán)是個(gè)不錯(cuò)的選擇柠辞。思路也很簡(jiǎn)單,在彈出鍵盤(pán)的同時(shí)獲取鍵盤(pán)對(duì)應(yīng)的window主胧,在window上加上我們需要的按鈕即可叭首。如下是筆者改動(dòng)的數(shù)字鍵盤(pán)。

下面踪栋,我對(duì)重點(diǎn)代碼做個(gè)講解:

-(void)keyboardWillShow:(NSNotification?*)notification{

????//移除掉原先添加的按鈕

????[self.extrakeyButton?removeFromSuperview];

????self.extrakeyButton?????=?nil;

????//這幾行代碼相信看了之前系列博客的讀者應(yīng)該很熟悉了

????NSDictionary?*userInfo??=?[notification?userInfo];

????CGFloat?animationDuration???=?[[userInfo?objectForKey:UIKeyboardAnimationDurationUserInfoKey]?floatValue];

????CGRect?kbEndFrame???????????=?[userInfo[UIKeyboardFrameEndUserInfoKey]?CGRectValue];

????CGFloat?kbHeight????????????=?kbEndFrame.size.height;

????//以下是對(duì)添加的X按鈕Frame的設(shè)置

????CGFloat?extrakeyButtonX?=?0;

????CGFloat?extrakeyButtonW?=?0;

????CGFloat?extrakeyButtonH?=?0;

????extrakeyButtonW?=?(SCREEN_WIDTH?-?7)?/?3;

????extrakeyButtonH?=?kbHeight?/?4;

????CGFloat?extrakeyButtonY?=?0;

????extrakeyButtonY?=?SCREEN_HEIGHT?+?kbHeight?-?extrakeyButtonH;

????//創(chuàng)建“X”按鈕焙格,并設(shè)置相應(yīng)的屬性

????self.extrakeyButton?=?[[UIButton?alloc]?initWithFrame:CGRectMake(extrakeyButtonX,?extrakeyButtonY,?extrakeyButtonW,?extrakeyButtonH)];

????[self.extrakeyButton?addTarget:self?action:@selector(buttonDidClicked)?forControlEvents:UIControlEventTouchUpInside];

????self.extrakeyButton.titleLabel.font?=?[UIFont?systemFontOfSize:27];

????[self.extrakeyButton?setTitle:@"X"?forState:(UIControlStateNormal)];

????[self.extrakeyButton?setTitleColor:[UIColor?blackColor]?forState:UIControlStateNormal];

????//獲取鍵盤(pán)對(duì)應(yīng)的Window(這段代碼只在iOS?11上做過(guò)測(cè)試,還不夠嚴(yán)謹(jǐn))

????UIWindow?*tempWindow?=?[[[UIApplication?sharedApplication]?windows]?lastObject];

????[tempWindow?addSubview:self.extrakeyButton];

????//設(shè)置動(dòng)畫(huà)

????[UIView?animateWithDuration:animationDuration?animations:^{

????????CGRect?frame????=?self.extrakeyButton.frame;

????????frame.origin.y??=?frame.origin.y?-?kbHeight;

????????self.extrakeyButton.frame?=?frame;

????}?completion:nil];

}

以上代碼只在iOS11的iPhone 8 Plus 上做過(guò)測(cè)試夷都,可能不具備一定的普遍性眷唉,比如iPhone X的鍵盤(pán)位置有一定改變,按鈕的位置需要加代碼兼容囤官。因此這種解決方案非常局限冬阳,只能用于身份證等業(yè)務(wù)非常簡(jiǎn)單的備選方案。有個(gè)iOS開(kāi)發(fā)者對(duì)這個(gè)鍵盤(pán)做了個(gè)封裝党饮,讀者可以點(diǎn)擊這里獲取

自己設(shè)計(jì)一個(gè)鍵盤(pán)

iOS中可以通過(guò)設(shè)置TextField/TextView的inputView來(lái)定制鍵盤(pán),

//The?custom?input?view?to?display?when?the?text?field?becomes?the?first?responder.

@property(readwrite,?strong)?UIView?*inputView;

這個(gè)自定義鍵盤(pán)就解決了我們開(kāi)頭提到的問(wèn)題:鍵盤(pán)上的數(shù)字是隨機(jī)排列的0-9肝陪,如果需要添加新的按鍵可以添加到鍵盤(pán)剩下的空白中。下面來(lái)講解一下核心代碼的實(shí)現(xiàn):

CustomKeyboardView?*keyView?=?[[CustomKeyboardView?alloc]?initWithFrame:CGRectMake(0,?0,?SCREEN_WIDTH,?176)];

self.xTextField.inputView?=?keyView;

-?(instancetype)initWithFrame:(CGRect)frame

{

????self?=?[super?initWithFrame:frame];

????if?(self)?{

????????self.backgroundColor?=?UIColor.lightGrayColor;

????????//創(chuàng)建數(shù)字?jǐn)?shù)組刑顺,并打亂

????????NSMutableArray?*integers?=?[[NSMutableArray?alloc]?init];

????????for?(NSInteger?i?=?0;?i?<?10;?++i)?{

????????????[integers?addObject:@(i)];

????????}

????????NSArray??*shuffledIntegers?=?[self?shuffle:integers];

????????//添加數(shù)字按鈕

????????for?(NSInteger?index?=?0;?index?<?10;?++index)?{

????????????UIButton?*btn?=?[UIButton?buttonWithType:UIButtonTypeCustom];

????????????btn.backgroundColor?=?UIColor.grayColor?;

????????????[btn?addTarget:self?action:@selector(buttonDidClicked:)?forControlEvents:UIControlEventTouchUpInside];

????????????btn.frame?=?CGRectMake(CGRectGetWidth(self.frame)?/?3?*?(index?%?3?),?45?*??(index?/?3?)?,?CGRectGetWidth(self.frame)?/?3?-?1,?44);

????????????NSString?*indexString?=?[NSString?stringWithFormat:@"%@",shuffledIntegers[index]];

????????????[btn?setTitle:indexString?forState:UIControlStateNormal];

????????????[self?addSubview:btn];

????????}


????}

????return?self;

}

打亂鍵盤(pán)中數(shù)字的布局方法很多镶柱,一般的洗牌算法就可以實(shí)現(xiàn):

-(NSArray?*)shuffle:(NSArray?*)array

{

????if(array?==?nil?||?array.count?<?1)

????????return?nil;

????NSMutableArray?*resultArray?=?[NSMutableArray?arrayWithArray:array];

????NSInteger?value;

????NSNumber?*median;


????for(NSInteger?index?=?0;?index?<?array.count;?index?++){

????????value?=?rand()?%?resultArray.count;

????????median?=?resultArray[index];


????????resultArray[index]?=?resultArray[value];

????????resultArray[value]?=?median;

????}

????return?resultArray;

}

最后是點(diǎn)擊鍵盤(pán)按鈕后的回調(diào)處理

-(void)buttonDidClicked:(UIButton?*)?sender{

????if?(self.delegate)?{

????????[self.delegate?keyboardItemDidClicked:sender.titleLabel.text];

????}

}

相比較而言,大家是否覺(jué)得這種方法比第一種方法既簡(jiǎn)單又簡(jiǎn)潔涯呻?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末壮吩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子贯城,更是在濱河造成了極大的恐慌熊楼,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鲫骗,居然都是意外死亡犬耻,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)执泰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)枕磁,“玉大人,你說(shuō)我怎么就攤上這事术吝〖萍茫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵排苍,是天一觀的道長(zhǎng)沦寂。 經(jīng)常有香客問(wèn)我,道長(zhǎng)淘衙,這世上最難降的妖魔是什么传藏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮彤守,結(jié)果婚禮上毯侦,老公的妹妹穿的比我還像新娘。我一直安慰自己具垫,他們只是感情好侈离,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著筝蚕,像睡著了一般卦碾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饰及,一...
    開(kāi)封第一講書(shū)人閱讀 49,816評(píng)論 1 290
  • 那天蔗坯,我揣著相機(jī)與錄音,去河邊找鬼燎含。 笑死宾濒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屏箍。 我是一名探鬼主播绘梦,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赴魁!你這毒婦竟也來(lái)了卸奉?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤颖御,失蹤者是張志新(化名)和其女友劉穎榄棵,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疹鳄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年拧略,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘪弓。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡垫蛆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腺怯,到底是詐尸還是另有隱情袱饭,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布呛占,位于F島的核電站虑乖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏栓票。R本人自食惡果不足惜决左,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一愕够、第九天 我趴在偏房一處隱蔽的房頂上張望走贪。 院中可真熱鬧,春花似錦惑芭、人聲如沸坠狡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)逃沿。三九已至,卻和暖如春幻锁,著一層夾襖步出監(jiān)牢的瞬間凯亮,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工哄尔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留假消,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓岭接,卻偏偏與公主長(zhǎng)得像富拗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸣戴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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