前言 1、UITextField 的創建 Objective C Swift 2、UITextField 的設置 Objective C Swift 3、textField 的編輯 協議方法,需遵守協議 UITextFieldDelegate,並設置代理 Objective C Swift 4、te ...
前言
NS_CLASS_AVAILABLE_IOS(2_0) @interface UITextField : UIControl <UITextInput, NSCoding>
@available(iOS 2.0, *) public class UITextField : UIControl, UITextInput, NSCoding
1、UITextField 的創建
Objective-C
// 實例化 UITextField 對象 UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 100, 200, 30)]; // 將 textField 加到 window 上顯示出來 [self.view addSubview:textField];
Swift
// 實例化 UITextField 對象 let textField:UITextField = UITextField(frame: CGRectMake(20, 100, 200, 30)) // 將 textField 加到 window 上顯示出來 self.view.addSubview(textField)
2、UITextField 的設置
Objective-C
// 設置邊框樣式 /* UITextBorderStyleNone, 無邊框,預設 UITextBorderStyleLine, 直線邊框 UITextBorderStyleBezel, 邊框 + 陰影 UITextBorderStyleRoundedRect 圓角矩形邊框 */ textField.borderStyle = UITextBorderStyleLine; // 設置背景顏色 /* 預設是透明的 */ textField.backgroundColor = [UIColor yellowColor]; // 設置背景圖片 textField.background = [UIImage imageNamed:@"pic2"]; // 設置提示文字 /* 用戶輸入時自動消失 */ textField.placeholder = @"請輸入用戶名"; // 設置輸入的字體顏色 textField.textColor = [UIColor redColor]; // 設置文字對齊方式 textField.textAlignment = NSTextAlignmentLeft; // 設置最小可縮小的字型大小 textField.minimumFontSize = 10; // 自動調整文字大小 /* 自動調整文字的大小以適應 textField 的寬度 */ textField.adjustsFontSizeToFitWidth = YES; // 設置密文輸入模式 /* default is NO */ textField.secureTextEntry = YES; // 設置顯示清除按鈕 /* UITextFieldViewModeNever, // default UITextFieldViewModeWhileEditing, UITextFieldViewModeUnlessEditing, UITextFieldViewModeAlways */ textField.clearButtonMode = UITextFieldViewModeWhileEditing; // 設置鍵盤樣式 /* UIKeyboardTypeDefault, // Default type for the current input method. UIKeyboardTypeASCIICapable, // Displays a keyboard which can enter ASCII characters, // non-ASCII keyboards remain active UIKeyboardTypeNumbersAndPunctuation, // Numbers and assorted punctuation. UIKeyboardTypeURL, // A type optimized for URL entry. UIKeyboardTypeNumberPad, // A number pad (0-9). Suitable for PIN entry. UIKeyboardTypePhonePad, // A phone pad (1-9, *, 0, #, with letters under the numbers). UIKeyboardTypeNamePhonePad, // A type optimized for entering a person's name or phone number. UIKeyboardTypeEmailAddress, // A type optimized for multiple email address entry. UIKeyboardTypeDecimalPad, // A number pad with a decimal point. UIKeyboardTypeTwitter, // A type optimized for twitter text entry (easy access to @ #) UIKeyboardTypeWebSearch, // A default keyboard type with URL-oriented addition. UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable, // Deprecated */ textField.keyboardType = UIKeyboardTypeDefault; // 設置返回鍵樣式 /* UIReturnKeyDefault, UIReturnKeyGo, UIReturnKeyGoogle, UIReturnKeyJoin, UIReturnKeyNext, UIReturnKeyRoute, UIReturnKeySearch, UIReturnKeySend, UIReturnKeyYahoo, UIReturnKeyDone, UIReturnKeyEmergencyCall, UIReturnKeyContinue NS_ENUM_AVAILABLE_IOS(9_0), */ textField.returnKeyType = UIReturnKeyJoin; // 設置輸入的字母大小寫模式 /* UITextAutocapitalizationTypeNone, UITextAutocapitalizationTypeWords, UITextAutocapitalizationTypeSentences, UITextAutocapitalizationTypeAllCharacters, */ textField.autocapitalizationType = UITextAutocapitalizationTypeWords; // 設置左右視圖顯示模式 /* 不設置模式,左右視圖顯示不出來 UITextFieldViewModeNever, UITextFieldViewModeWhileEditing, UITextFieldViewModeUnlessEditing, UITextFieldViewModeAlways */ textField.leftViewMode = UITextFieldViewModeAlways; textField.rightViewMode = UITextFieldViewModeAlways; // 設置左右視圖 textField.leftView = label1; textField.rightView = label2; // 讓 textField 獲取第一響應 /* 打開應用程式或界面時直接彈出鍵盤 */ [textField becomeFirstResponder]; // 讓 textField 放棄第一響應 /* 收起鍵盤 */ [textField resignFirstResponder]; // 設置 textField 的代理,需遵守協議 <UITextFieldDelegate> textField.delegate = self;
Swift
// 設置邊框樣式 /* case None 無邊框,預設 case Line 直線邊框 case Bezel 邊框 + 陰影 case RoundedRect 圓角矩形邊框 */ textField.borderStyle = .Line // 設置背景顏色 /* 預設是透明的 */ textField.backgroundColor = UIColor.yellowColor() // 設置背景圖片 textField.background = UIImage(named: "pic2") // 設置提示文字 /* 用戶輸入時自動消失 */ textField.placeholder = "請輸入用戶名" // 設置輸入的字體顏色 textField.textColor = UIColor.redColor() // 設置文字對齊方式 textField.textAlignment = NSTextAlignment.Left // 設置最小可縮小的字型大小 textField.minimumFontSize = 10 // 自動調整文字大小 /* 自動調整文字的大小以適應 textField 的寬度 */ textField.adjustsFontSizeToFitWidth = true // 設置密文輸入模式 /* default is NO */ textField.secureTextEntry = true // 設置顯示清除按鈕 /* case Never // default case WhileEditing case UnlessEditing case Always */ textField.clearButtonMode = .WhileEditing // 設置鍵盤樣式 /* case Default // Default type for the current input method. case ASCIICapable // Displays a keyboard which can enter ASCII characters, // non-ASCII keyboards remain active case NumbersAndPunctuation // Numbers and assorted punctuation. case URL // A type optimized for URL entry. case NumberPad // A number pad (0-9). Suitable for PIN entry. case PhonePad // A phone pad (1-9, *, 0, #, with letters under the numbers). case NamePhonePad // A type optimized for entering a person's name or phone number. case EmailAddress // A type optimized for multiple email address entry. case DecimalPad // A number pad with a decimal point. case Twitter // A type optimized for twitter text entry (easy access to @ #) case WebSearch // A default keyboard type with URL-oriented addition. public static var Alphabet: UIKeyboardType { get } // Deprecated */ textField.keyboardType = .Default // 設置返回鍵樣式 /* case Default case Go case Google case Join case Next case Route case Search case Send case Yahoo case Done case EmergencyCall case Continue */ textField.returnKeyType = .Join // 設置輸入的字母大小寫模式 /* case None case Words case Sentences case AllCharacters */ textField.autocapitalizationType = .Words // 設置左右視圖顯示模式 /* 不設置模式,左右視圖顯示不出來 case Never case WhileEditing case UnlessEditing case Always */ textField.leftViewMode = .Always textField.rightViewMode = .Always // 設置左右視圖 textField.leftView = label1 textField.rightView = label2 // 讓 textField 獲取第一響應 /* 打開應用程式或界面時直接彈出鍵盤 */ textField.becomeFirstResponder() // 讓 textField 放棄第一響應 /* 收起鍵盤 */ textField.resignFirstResponder() // 設置 textField 的代理,需遵守協議 UITextFieldDelegate textField.delegate = self
3、textField 的編輯
協議方法,需遵守協議 UITextFieldDelegate,並設置代理
Objective-C
// 將要開始編輯,編輯開始前被調用 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { return YES; } // 已經開始編輯,編輯開始後被調用 - (void)textFieldDidBeginEditing:(UITextField *)textField { } // 將要結束編輯,編輯結束前被調用 - (BOOL)textFieldShouldEndEditing:(UITextField *)textField { return YES; } // 已經結束編輯,編輯結束後被調用 - (void)textFieldDidEndEditing:(UITextField *)textField { // 輸出 textfield 中輸入的內容 NSLog(@"您輸入的內容為:%@", textField.text); } // 文本修改,文本修改前被調用 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { return YES; } // 返回,鍵盤上的 return 鍵觸摸後調用 - (BOOL)textFieldShouldReturn:(UITextField *)textField { return YES; } // 清空,文本輸入框中清除按鈕被觸摸時調用 - (BOOL)textFieldShouldClear:(UITextField *)textField { return YES; }
Swift
// 將要開始編輯,編輯開始前被調用 func textFieldShouldBeginEditing(textField: UITextField) -> Bool { return true } // 已經開始編輯,編輯開始後被調用 func textFieldDidBeginEditing(textField: UITextField) { } // 將要結束編輯,編輯結束前被調用 func textFieldShouldEndEditing(textField: UITextField) -> Bool { return true } // 已經結束編輯,編輯結束後被調用 func textFieldDidEndEditing(textField: UITextField) { // 輸出 textfield 中輸入的內容 print("您輸入的內容為:\(textField.text)") } // 文本修改,文本修改前被調用 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { return true } // 返回,鍵盤上的 return 鍵觸摸後調用 func textFieldShouldReturn(textField: UITextField) -> Bool { return true } // 清空,文本輸入框中清除按鈕被觸摸時調用 func textFieldShouldClear(textField: UITextField) -> Bool { return true }
4、textField 的鍵盤迴收
Objective-C
觸摸手勢回收
- 用觸摸手勢方式回收鍵盤,觸摸界面時鍵盤消失
// 單一 textField 回收鍵盤 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 將 tag 值為 100 的 textField 重定向到當前 textField UITextField *textField = (id)[self.view viewWithTag:100]; // 讓 textField 放棄第一響應,收起鍵盤 [textField resignFirstResponder]; } // 所有 textField 都回收鍵盤 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; }
return 鍵回收
- 用代理方式回收鍵盤(鍵盤上的 return 鍵回收鍵盤),需遵守協議 UITextFieldDelegate,並設置代理
// 設置 textField 的代理 textField1.delegate = self; textField2.delegate = self; // UITextFieldDelegate 協議方法返回,鍵盤上的 return 鍵觸摸後調用 - (BOOL)textFieldShouldReturn:(UITextField *)textField { UITextField *textField_1 = (id)[self.view viewWithTag:200]; UITextField *textField_2 = (id)[self.view viewWithTag:300]; if (textField == textField_1) { // 讓 textField_2 獲取第一響應 // 點擊 textfield_1 上的 return 鍵時,輸入游標自動跳轉到 textfield_2 內 [textField_2 becomeFirstResponder]; } else{ // 讓 textField_2 放棄第一響應 // 點擊 textfield_2 上的 return 鍵時,鍵盤迴收 [textField_2 resignFirstResponder]; } return YES; }
Swift
觸摸手勢回收
- 用觸摸手勢方式回收鍵盤,觸摸界面時鍵盤消失
// 單一 textField 回收鍵盤 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { // 將 tag 值為 100 的 textField 重定向到當前 textField let textField:UITextField = self.view.viewWithTag(100) as! UITextField // 讓 textField 放棄第一響應,收起鍵盤 textField.resignFirstResponder() } // 所有 textField 都回收鍵盤 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { self.view.endEditing(true) }
return 鍵回收
- 用代理方式回收鍵盤(鍵盤上的 return 鍵回收鍵盤),需遵守協議 UITextFieldDelegate,並設置代理
// 設置 textField 的代理 textField1.delegate = self textField2.delegate = self // UITextFieldDelegate 協議方法返回,鍵盤上的 return 鍵觸摸後調用 func textFieldShouldReturn(textField: UITextField) -> Bool { let textField_1:UITextField = self.view.viewWithTag(200) as! UITextField let textField_2:UITextField = self.view.viewWithTag(300) as! UITextField if textField == textField_1 { // 讓 textField_2 獲取第一響應 // 點擊 textfield_1 上的 return 鍵時,輸入游標自動跳轉到 textfield_2 內 textField_2.becomeFirstResponder() } else{ // 讓 textField_2 放棄第一響應,點擊 textfield_2 上的 return 鍵時,鍵盤迴收 textField_2.resignFirstResponder() } return true }
5、textField 視圖的上升/下降
Objective-C
用系統觀察者控制
// 添加系統���知觀察者(檢測鍵盤的顯示與隱藏) // 檢測鍵盤的彈起 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardShow:) name:UIKeyboardWillShowNotification object:nil]; // 檢測鍵盤的隱藏 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardHide:) name:UIKeyboardWillHideNotification object:nil]; // 鍵盤彈起事件處理 - (void)keyboardShow:(NSNotification *)notification { // 獲取當前視圖的 frame CGRect frame = self.view.frame; frame.origin.y = -53; [UIView animateWithDuration:0.5 animations:^{ self.view.frame = frame; }]; } // 鍵盤隱藏事件處理 - (void)keyboardHide:(NSNotification *)notification { CGRect frame = self.view.frame; frame.origin.y = 0; [UIView animateWithDuration:0.5 animations:^{ self.view.frame = frame; }]; }
用協議方法控制
// 開始編輯 - (void)textFieldDidBeginEditing:(UITextField *)textField { // 獲取當前視圖的 frame CGRect frame = self.view.frame; frame.origin.y = -53; [UIView animateWithDuration:0.5 animations:^{ self.view.frame = frame; }]; } // 結束編輯 - (void)textFieldDidEndEditing:(UITextField *)textField { CGRect frame = self.view.frame; frame.origin.y = 0; [UIView animateWithDuration:0.5 animations:^{ self.view.frame = frame; }]; }
Swift
用系統觀察者控制
// 添加系統通知觀察者(檢測鍵盤的顯示與隱藏) // 檢測鍵盤的彈起 NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(UiTextField.keyboardShow(_:)), name: UIKeyboardWillShowNotification, object: nil) // 檢測鍵盤的隱藏 NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(UiTextField.keyboardHide(_:)), name: UIKeyboardWillHideNotification, object: nil) // 鍵盤彈起事件處理 func keyboardShow(notification:NSNotification) { // 獲取當前視圖的 frame var frame:CGRect = self.view.frame frame.origin.y = -53 UIView.animateWithDuration(0.5, animations: { () -> Void in self.view.frame = frame }) } // 鍵盤隱藏事件處理 func keyboardHide(notification:NSNotification) { var frame:CGRect = self.view.frame frame.origin.y = 0 UIView.animateWithDuration(0.5, animations: { () -> Void in self.view.frame = frame }) }
用協議方法控制
// 開始編輯 func textFieldDidBeginEditing(textField: UITextField) { // 獲取當前視圖的 frame var frame:CGRect = self.view.frame frame.origin.y = -53 UIView.animateWithDuration(0.5, animations: { () -> Void in self.view.frame = frame }) } // 結束編輯 func textFieldDidEndEditing(textField: UITextField) { var frame:CGRect = self.view.frame frame.origin.y = 0 UIView.animateWithDuration(0.5, animations: { () -> Void in self.view.frame = frame }) }
6、計算鍵盤高度
不同型號的 iOS 設備的鍵盤尺寸:
Type iPhone 6(s) Plus iPhone 6(s) iPhone 5(s/c)/4(s)/SE Default ASCIICapable NumbersAndPunctuation URL 271 258 253 EmailAddress Twitter WebSearch Alphabet ------------------------ ------------------ -------------- ------------------------- NumberPad PhonePad 226 216 216 NamePhonePad DecimalPad Objective-C
// 在系統觀察者響應方法中,獲取觀察的信息 NSDictionary *userInfo = notification.userInfo; CGFloat keyboardHeight = [userInfo[@"UIKeyboardFrameEndUserInfoKey"] CGRectValue].size.height;
Swift
// 在系統觀察者響應方法中,獲取觀察的信息 let userInfo = notification.userInfo! let keyboardHeight = userInfo["UIKeyboardFrameEndUserInfoKey"]?.CGRectValue().size.height
7、Storyboard 中設置
在 Storyboard 場景中設置
Text Field 設置
Text 文字類型及文字 Color 文字顏色 Font 文字字體 Alignment 文字對齊方式 Placeholder 占位文字 Background 背景圖片 Disabled 無效狀態背景圖片 Border Style 邊框類型 Clear Button 清除按鈕顯示時間 -- Clear when editing begins 開始編輯時顯示清楚按鈕 Min Font Size 最小字體大小 -- Adjust to Fit 自動調整文字大小 Capitalization 大小寫模式 Correction 自動糾正 Spell Checking 拼寫檢查 Keyboard Type 鍵盤樣式 Appearance Return Key 返回鍵樣式 -- Auto-enable Return Key 自動使能返回鍵 -- Secure Text Entry 密文輸入 Control 設置
Alignment 文字對齊方式 Content -- Selected 選中 -- Enable 可用 -- Highlighted 高亮