一:首先查看一下關於UITextField的定義
NS_CLASS_AVAILABLE_IOS(2_0) @interface UITextField : UIControl <UITextInput, NSCoding> @property(nullable, nonatomic,copy) NSString *text; //值 @property(nullable, nonatomic,copy) NSAttributedString *attributedText NS_AVAILABLE_IOS(6_0); //富文本的值 @property(nullable, nonatomic,strong) UIColor *textColor; // 文字色 @property(nullable, nonatomic,strong) UIFont *font; // 字體 @property(nonatomic) NSTextAlignment textAlignment; // 默認值 NSLeftTextAlignment 排版 @property(nonatomic) UITextBorderStyle borderStyle; // 默認值 UITextBorderStyleNone 邊框的樣式 @property(nonatomic,copy) NSDictionary<NSString *, id> *defaultTextAttributes NS_AVAILABLE_IOS(7_0); // 文本屬性 用字典填充 @property(nullable, nonatomic,copy) NSString *placeholder; // 空值時的提示文字 @property(nullable, nonatomic,copy) NSAttributedString *attributedPlaceholder NS_AVAILABLE_IOS(6_0); // 富文本的空值提示文字 @property(nonatomic) BOOL clearsOnBeginEditing; // 默認值 NO 如果設為YES 再次編輯就清空 @property(nonatomic) BOOL adjustsFontSizeToFitWidth; // 默認值NO,若設為YES 當文字超出文本框寬度時,自動調整文字大小 @property(nonatomic) CGFloat minimumFontSize; // 默認值 0.0.最小可縮小的字號和adjustsFontSizeToFitWidth一起使用 @property(nullable, nonatomic,weak) id<UITextFieldDelegate> delegate; //代理 @property(nullable, nonatomic,strong) UIImage *background; //設置背景 注意只有UITextBorderStyleNone的時候改屬性有效 @property(nullable, nonatomic,strong) UIImage *disabledBackground; //禁用的背景 @property(nonatomic,readonly,getter=isEditing) BOOL editing; //是否被編輯 @property(nonatomic) BOOL allowsEditingTextAttributes NS_AVAILABLE_IOS(6_0); // 默認值 NO @property(nullable, nonatomic,copy) NSDictionary<NSString *, id> *typingAttributes NS_AVAILABLE_IOS(6_0); @property(nonatomic) UITextFieldViewMode clearButtonMode; // 輸入框中是否有個叉號 設置清除 何時顯示 @property(nullable, nonatomic,strong) UIView *leftView; // 左邊視圖 @property(nonatomic) UITextFieldViewMode leftViewMode; // 在什麼狀態下顯示 默認值 UITextFieldViewModeNever @property(nullable, nonatomic,strong) UIView *rightView; // 右邊視圖 @property(nonatomic) UITextFieldViewMode rightViewMode; // 默認值 UITextFieldViewModeNever //界面重寫繪制行為 ////重寫來重置邊緣區域 - (CGRect)borderRectForBounds:(CGRect)bounds; //重寫來重置文字區域 - (CGRect)textRectForBounds:(CGRect)bounds; //重寫來重置占位符區域 - (CGRect)placeholderRectForBounds:(CGRect)bounds; //重寫來重置編輯區域 - (CGRect)editingRectForBounds:(CGRect)bounds; //重寫來重置clearButton位置,改變size可能導致button的圖片失真 - (CGRect)clearButtonRectForBounds:(CGRect)bounds; - (CGRect)leftViewRectForBounds:(CGRect)bounds; - (CGRect)rightViewRectForBounds:(CGRect)bounds; //改變繪文字屬性.重寫時調用super可以按默認圖形屬性繪制,若自己完全重寫繪制函數,就不用調用super了. - (void)drawTextInRect:(CGRect)rect; //重寫改變繪制占位符屬性.重寫時調用super可以按默認圖形屬性繪制,若自己完全重寫繪制函數,就不用調用super了. - (void)drawPlaceholderInRect:(CGRect)rect; @property (nullable, readwrite, strong) UIView *inputView; //代替標准的系統鍵盤 @property (nullable, readwrite, strong) UIView *inputAccessoryView; //編輯時顯示在系統鍵盤或用戶自定義的inputView上面的視圖 @property(nonatomic) BOOL clearsOnInsertion NS_AVAILABLE_IOS(6_0); // 默認值NO @end
UITextField是繼承於UIControl,並且遵循NSCoding及UITextInput的協議;UITextInput的協議作用是用來輔助鍵盤輸入得協議,在需要用到鍵盤輸入得地方都需要實現這個協議;
知識點1:UITextBorderStyle的枚舉內容
typedef NS_ENUM(NSInteger, UITextBorderStyle) {
UITextBorderStyleNone,/無任何邊框
UITextBorderStyleLine,//黑色線框
UITextBorderStyleBezel,//邊線+陰影
UITextBorderStyleRoundedRect //淺色帶圓弧線框
};
知識點2:UITextFieldViewMode的枚舉內容
typedef NS_ENUM(NSInteger, UITextFieldViewMode) {
UITextFieldViewModeNever,//無清除按鈕
UITextFieldViewModeWhileEditing,//編輯時出現清除按鈕
UITextFieldViewModeUnlessEditing,//編輯時不出現,編輯後才出現清除按鈕
UITextFieldViewModeAlways //一直顯示清除按鈕
};
知識點3:關於NSTextAlignment的說明,UITextAlignmentLeft (水平右對齊),UITextAlignmentCenter(水平居中對齊),UITextAlignmentRight (水平右對齊);
知識點4:修改UITextField中關於Placeholder的著色
[self.myTextField setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];
當然也可以采用另外一種方式:
NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc]initWithString:@"水印提示文字"];
[attrString addAttribute:NSForegroundColorAttributeNam
value:[UIColor redColor]
range:NSMakeRange(0, 2)];
myTextFieldattributedPlaceholder = attrString;
知識點5:關於leftView跟leftViewMode的運用
_relayTextField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
_relayTextField.backgroundColor = [UIColor whiteColor];
_relayTextField.font = [UIFont fontWithName:@"OpenSans" size:15.0];
_relayTextField.delegate = self;
_relayTextField.layer.cornerRadius = 5.0f;
_relayTextField.layer.masksToBounds = YES;
_relayTextField.clearButtonMode = UITextFieldViewModeWhileEditing;
_relayTextField.autocorrectionType = UITextAutocorrectionTypeNo;
_relayTextField.autocapitalizationType = UITextAutocapitalizationTypeNone;
_relayTextField.returnKeyType=UIReturnKeySend;
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 10, 70, 37)];
label.font = [UIFont boldSystemFontOfSize:15];
label.adjustsFontSizeToFitWidth = YES;
label.textColor = COLOR_WORD_GRAY_2;
_relayTextField.leftView = label;
_relayTextField.leftViewMode = UITextFieldViewModeAlways;
[self addSubview:_relayTextField];
設置顯示的值:
-(void)configuerWithName:(NSString*)name messageId:(NSString*)message_id
{
_name = name;
_messageId = message_id;
if ([_relayTextField.leftView isKindOfClass:[UILabel class]]) {
((UILabel*)_relayTextField.leftView).text = [NSString stringWithFormat:@"回復%@ :",name];
((UILabel*)_relayTextField.leftView).textColor = COLOR_WORD_GRAY_2;
}
}
知識點6:inputView跟inputAccessoryView 默認是系統的鍵盤,比如有自定義的鍵盤就可以把它賦值給inputView;當然也可以是其它效果的視圖,比如彈出選擇器等;實例如下:
//自定義鍵盤,將原有的鍵盤隱藏,顯示當前自定義視圖 UIView *keyBoardContent = [[UIView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 100)]; keyBoardContent.backgroundColor = [UIColor darkGrayColor]; myTextField.inputView = keyBoardContent; UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 80)]; subView.backgroundColor = [UIColor greenColor]; myTextField.inputAccessoryView = subView;
二:UITextInputTraits的相關內容,UITextField遵循這個協議,用來輔助鍵盤輸入得協議,在需要用到鍵盤輸入得地方都需要實現這個協議
@protocol UITextInputTraits <NSObject> @optional @property(nonatomic) UITextAutocapitalizationType autocapitalizationType; // default is UITextAutocapitalizationTypeSentences @property(nonatomic) UITextAutocorrectionType autocorrectionType; //是否糾錯 默認值 UITextAutocorrectionTypeDefault @property(nonatomic) UITextSpellCheckingType spellCheckingType NS_AVAILABLE_IOS(5_0); // default is UITextSpellCheckingTypeDefault; @property(nonatomic) UIKeyboardType keyboardType; // 鍵盤類型 默認值UIKeyboardTypeDefault @property(nonatomic) UIKeyboardAppearance keyboardAppearance; // 設定鍵盤顯示風格 默認值 UIKeyboardAppearanceDefault @property(nonatomic) UIReturnKeyType returnKeyType; // default is UIReturnKeyDefault (See note under UIReturnKeyType enum) @property(nonatomic) BOOL enablesReturnKeyAutomatically; // 設定當文本框沒有輸入內容時鍵盤得返回鍵是否可用@property(nonatomic,getter=isSecureTextEntry) BOOL secureTextEntry; // 設定輸入文本是否要受到隱藏保護,默認為NO不保護,設定為YES,則文本輸入後為密碼風格得保護 @end
知識點7:secureTextEntry是設置是否顯示成密碼的形式,此屬性並不在UITextField裡面
知識點8:UIReturnKeyType(UITextInputTraits中)的枚舉內容如下
UIReturnKeyDefault ;//默認灰色按鈕,標有Return
UIReturnKeyGo ;//標有Go的藍色按鈕
UIReturnKeyGoogle ;//標有Google的藍色按鈕,用語搜索
UIReturnKeyJoin ;//標有Join的藍色按鈕
UIReturnKeyNext ;//標有Next的藍色按鈕
UIReturnKeyRoute ;//標有Route的藍色按鈕
UIReturnKeySearch ;//標有Search的藍色按鈕
UIReturnKeySend ;//標有Send的藍色按鈕
UIReturnKeyYahoo ;//標有Yahoo的藍色按鈕
UIReturnKeyYahoo ;//標有Yahoo的藍色按鈕
UIReturnKeyEmergencyCall;//緊急呼叫按鈕
知識點9:autocapitalizationType(UITextInputTraits中)首字母是否大寫
UITextAutocapitalizationTypeNone ;//不自動大寫
UITextAutocapitalizationTypeWords ;//單詞首字母大寫
UITextAutocapitalizationTypeSentences ;//句子的首字母大寫
UITextAutocapitalizationTypeAllCharacters;//所有字母都大寫
知識點10:keyboardAppearance(UITextInputTraits中)鍵盤外觀
UIKeyboardAppearanceDefault ;//默認外觀,淺灰色 UIKeyboardAppearanceAlert ;//深灰石墨色
知識點11:autocorrectionType(UITextInputTraits中)是否糾錯
UITextAutocorrectionTypeDefault ; //默認
UITextAutocorrectionTypeNo ; //不自動糾錯
UITextAutocorrectionTypeYes ; //自動糾錯
知識點12:使文本框在界面打開時就獲取焦點,並彈出輸入鍵盤:[myTextField becomeFirstResponder]; 使文本框失去焦點,並收回鍵盤[myTextFieldresignfirstresponder]
鍵盤收起其它方式 //方式 1: [[[UIApplication sharedApplication]keyWindow] endEditing:YES]; //方式 2: [[UIApplication sharedApplication]sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil]; //方式 3: [self.view endEditing:YES];
知識點13:因為UITextFiled是繼承於UIControl,所以它也是有增加事件addTaget的效果
[myTextField addTarget:self
action:@selector(textFieldDidChange:)//私有方法
forControlEvents:UIControlEventEditingChanged];
- (void)textFieldDidChange:(UITextField*)textField{//類似UIButton addTag..監聽方法
NSLog(@"輸入框內容 = %@",textField.text);
}
知識點14:關於UITextFiled的NotificaitonCenter監聽
UITextFieldTextDidBeginEditingNotification ;//監聽開始編輯
UITextFieldTextDidChangeNotification ;//監聽正在編輯
UITextFieldTextDidEndEditingNotification ;//監聽結束編輯
實例:
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
selector:@selector(texfFieldNotification:)
name:UITextFieldTextDidChangeNotification object:nil];
- (void)texfFieldNotification:(NSNotification*)noti{//私有方法
NSLog(@"輸入款變化了");
}
當然記得在用後時移除通知;
知識點15:監聽鍵盤出現,知曉鍵盤CGRect
- (void)efObserverKeyBoardShowAndHidde{
//注冊鍵盤出現
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyBoardWasShow:)
name:UIKeyboardWillShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyBoardWillBeHidden:)
name:UIKeyboardWillHideNotification
object:nil];
}
- (void)keyBoardWasShow:(NSNotification*)aNotification{
NSLog(@"鍵盤出現");
//鍵盤高度
//CGRect keyBoardFrame = [[[aNotification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
}
-(void)keyBoardWillBeHidden:(NSNotification*)aNotification{
NSLog(@"鍵盤消失");
}
- (void)removeObserver{//移除所有通知
[[NSNotificationCenter defaultCenter]removeObserver:self];
}
三:UITextField定義的協議UITextFieldDelegate內容
@protocol UITextFieldDelegate <NSObject> @optional - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField; // 返回一個BOOL值,指定是否循序文本字段開始編輯 - (void)textFieldDidBeginEditing:(UITextField *)textField; // 開始編輯時觸發,獲得焦點時 - (BOOL)textFieldShouldEndEditing:(UITextField *)textField; // 返回BOOL值,指定是否允許文本字段結束編輯,當編輯結束後 - (void)textFieldDidEndEditing:(UITextField *)textField; // 結束編輯 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; // 用戶不段的輸入,可以控制達到某些條件,禁止輸入 - (BOOL)textFieldShouldClear:(UITextField *)textField; // 返回一個BOOL值指明是否滿足什麼條件清除內容 - (BOOL)textFieldShouldReturn:(UITextField *)textField; // 返回一個BOOL值,指明是否允許在按下回車鍵時結束編輯 @end
知識點1:運用實例
//限定輸入條件
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
//得到輸入框的內容
NSString * textString = [textField.text stringByReplacingCharactersInRange:range withString:string];
if ([string isEqualToString:@"\n"]) {
NSLog(@"回車");
}
if ([string isEqualToString:@""]) {
NSLog(@"後退");
}
if ([string isEqualToString:@" "]) {
NSLog(@"空格");
//return NO;//禁止空格輸入
}
if (textString.length>4) {
NSLog(@"輸入超過5位數");
}
//打印當前鍵盤輸入模式,en-US,zh-Hans....
NSString *lang = [[UITextInputMode currentInputMode]primaryLanguage];
//ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
//限制輸入已知的字符
NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789\n"]invertedSet];
//按cs分離出數組,數組按@""分離出字符串
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs]componentsJoinedByString:@""];
BOOL canChange = [string isEqualToString:filtered];
return YES;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField{//辭去職務
//主要是[receiver resignFirstResponder]在哪調用就能把receiver對應的鍵盤往下收
[textField resignFirstResponder];
return YES;
}