Dismiss the numberPad keyboard type
如何收起數字鍵盤
iOS內建的數字鍵盤預設是沒有return鍵的,有時候會造成使用者的困擾,是的,客戶直接跟我抱怨:『數字鍵盤怎麼收不起來啊?』(真的抱歉,我是菜鳥工程師)。
好的,菜鳥工程師要來紀錄一下怎麼讓數字鍵盤收起來!
內建的鍵盤Type
apple爸爸給了我們很多鍵盤Type,很好用很方便,所有的種類可以參考:
使用數字鍵盤可以避免使用者誤輸入其他文字及符號,可減少輸入檢核的步驟,真的蠻方便的。
很簡單只要這樣做:
swift
numberLabel.keyboardType = .numberPad
objective-c
[_numberLabel setKeyboardType:UIKeyboardTypeNumberPad];
可是,輸入完數字要怎麼收鍵盤啊?
方法一:點擊空白處收起鍵盤
我很喜歡這個方法,這方法適用於所有輸入類型的TextField,可以增快輸入完所有欄位的速度。
這方法是使用UITapGestureRecognizer處理手勢動作後的任務,在view上面增加手勢點擊事件,點擊空白處結束編輯離開鍵盤。
swift
func addTapGesture(){
let tap = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
view.addGestureRecognizer(tap)
}@objc private func hideKeyboard(){
self.view.endEditing(true)
}
然後在viewDidLoad呼叫此function,之後點擊畫面空白處都可以收鍵盤了。
override func viewDidLoad() {
super.viewDidLoad() addTapGesture()
}
objective-c
這裡我是直接寫在viewDidLoad裡面
- (void)viewDidLoad {
[super viewDidLoad];
//呼叫點擊空白處收鍵盤
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewTapped:)];
tap.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tap];
}//點擊頁面的空白處收回鍵盤的動作
-(void)viewTapped:(UITapGestureRecognizer*)tap1{
[self.view endEditing:YES];
}
一樣只要點擊畫面空白處都可以收鍵盤了。
方法二:在數字鍵盤上面增加按鈕收起鍵盤
這個方法可能比較直覺式,就跟其他Type有return鍵一樣(但我個人還是喜歡點空白處收鍵盤啦!)
做法是在數字鍵盤上使用UIToolbar並用UIBarButtonItem去增加Done鍵,然後再呼叫resignFirstResponder函式把鍵盤收起來。
swift
我會寫在Swift File裡,這樣之後不管哪一個class都可以呼叫這個方法。
import Foundation
import UIKitextension UITextField { func setNumberKeyboardReturn(){
//設定寬度
let width = Float(UIScreen.main.bounds.width)
//設定ToolBar大小及位置
let accessoryView = UIToolbar(frame: CGRect(x: 0, y: 0, width: CGFloat(width), height: CGFloat(0.1 * width)))
//設定UIBarButtonItem
let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
//設定Done鍵的動作
let done = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(selectDoneButton))
//設定ToolBar
accessoryView.items = [space,done,space]
//加入畫面
self.inputAccessoryView = accessoryView}
//呼叫收起鍵盤的函式
@objc func selectDoneButton(){
self.resignFirstResponder()
}
}
然後在要使用此function的class去呼叫它。
import UIKitclass TestViewController: UIViewController ,UITextFieldDelegate {
@IBOutlet weak var numberLabel: UITextField!
override func viewDidLoad() {
super.viewDidLoad() numberLabel.keyboardType = .numberPad
numberLabel.setNumberKeyboardReturn()
} }
objective-c
新增一個Public class放收數字鍵盤的function(一樣是讓所有class都可呼叫此function)。
在 .h 檔增加:
-(void) setNumberKeyboardReturn: (UITextField*) TextField;
這裡我設定要傳入使用此function的TextField。
在 .m 檔增加:
-(void) setNumberKeyboardReturn: (UITextField*) TextField{
//將傳入的TextField存起來
_iTextField = TextField;
//設定寬度
float appWidth = CGRectGetWidth([UIScreen mainScreen].bounds);
//設定Toolbar尺寸大小及位置
UIToolbar *accessoryView = [[UIToolbar alloc]
initWithFrame:CGRectMake(0, 0, appWidth, 0.1 * appWidth)];
//設定BarButtonItem
UIBarButtonItem *space = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
target:nil
action:nil];
//設定BarButtonItem的動作
UIBarButtonItem *done = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemDone
target:self
action:@selector(selectDoneButton)];
//設定Toolbar
accessoryView.items = @[space, done, space];
//加入畫面
TextField.inputAccessoryView = accessoryView;
}- (void)selectDoneButton{
//傳入的TextField呼叫收鍵盤函式
[_iTextField resignFirstResponder];
}
然後在要使用此function的class去呼叫它。
[_uc setNumberKeyboardReturn:_numberLabel];
ps. _uc是我Public class的名稱啦!對了!objective-c如果要呼叫Public class裡的function,要先import class喲!
#import "UC.h"@property UC *uc;
不知道有幾位新手會想看objective-c的寫法,就當作是寫給我自己看的囉!如果大家有更好的方法也歡迎與我分享。
好久沒寫文章,最近有寫一個小作品但還沒空分享,等我有空再來補一補(哭)。
如果有值得大家參考的地方再麻煩大家幫我拍拍手喲,謝謝大家耐心閱讀🙇♀️