你真的瞭解UITextField嗎?

来源:http://www.cnblogs.com/wujy/archive/2016/08/25/5807073.html
-Advertisement-
Play Games

一:首先查看一下關於UITextField的定義 UITextField是繼承於UIControl,並且遵循NSCoding及UITextInput的協議;UITextInput的協議作用是用來輔助鍵盤輸入得協議,在需要用到鍵盤輸入得地方都需要實現這個協議; 知識點1:UITextBorderSty ...


一:首先查看一下關於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的協議作用是用來輔助鍵盤輸入得協議,在需要用到鍵盤輸入得地方都需要實現這個協議;

知識點1UITextBorderStyle的枚舉內容

typedef NS_ENUM(NSInteger, UITextBorderStyle) {
    UITextBorderStyleNone,/無任何邊框
    UITextBorderStyleLine,//黑色線框
    UITextBorderStyleBezel,//邊線+陰影
    UITextBorderStyleRoundedRect //淺色帶圓弧線框
};

知識點2UITextFieldViewMode的枚舉內容

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;
    }
}

知識點6inputView跟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裡面

知識點8UIReturnKeyType(UITextInputTraits中)的枚舉內容如下

    UIReturnKeyDefault      ;//預設灰色按鈕,標有Return
    UIReturnKeyGo           ;//標有Go的藍色按鈕
    UIReturnKeyGoogle       ;//標有Google的藍色按鈕,用語搜索
    UIReturnKeyJoin         ;//標有Join的藍色按鈕
    UIReturnKeyNext         ;//標有Next的藍色按鈕
    UIReturnKeyRoute        ;//標有Route的藍色按鈕
    UIReturnKeySearch       ;//標有Search的藍色按鈕
    UIReturnKeySend         ;//標有Send的藍色按鈕
    UIReturnKeyYahoo        ;//標有Yahoo的藍色按鈕
    UIReturnKeyYahoo        ;//標有Yahoo的藍色按鈕
    UIReturnKeyEmergencyCall;//緊急呼叫按鈕

知識點9autocapitalizationType(UITextInputTraits中)首字母是否大寫

    UITextAutocapitalizationTypeNone         ;//不自動大寫
    UITextAutocapitalizationTypeWords        ;//單詞首字母大寫
    UITextAutocapitalizationTypeSentences    ;//句子的首字母大寫
    UITextAutocapitalizationTypeAllCharacters;//所有字母都大寫

知識點10keyboardAppearance(UITextInputTraits中)鍵盤外觀

   UIKeyboardAppearanceDefault ;//預設外觀,淺灰色
   UIKeyboardAppearanceAlert   ;//深灰石墨色

知識點11autocorrectionType(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;
}

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 截止到ES6,共有6種聲明變數的方法,分別是var 、function以及新增的let、const、import和class; 我們通常的賦值方法是: es6給我們提供了一種嶄新賦值方式:解構賦值; 例如我們需要聲明3個變數,我們用傳統的賦值方式和解構賦值做一個比較; es5: es6: 是不是很方 ...
  • 原文:Angus Croll 譯文:伯樂線上專欄作者 - 古魯伊 鏈接:http://web.jobbole.com/87534/ 點擊 → 瞭解如何加入專欄作者 我們從一些小測試開始。以下情況都會彈出什麼結果? 題 1: function foo(){ function bar() { retur ...
  • UICollectionViewCell定製Button 效果 特點 1.能夠動態設置每行顯示的按鈕的個數,以及控制項的擺放格式 2.實現單選或者多選的功能,實現點擊事件 3.自定製按鈕的顯示樣式 用法 1.下載源碼後,將文件中的GridCollectionView.h/.m文件, CustomCol ...
  • 一、說明 今天給角色精靈增加了子彈發射功能,增加了子彈與敵對精靈的碰撞檢測,當角色精靈子彈與敵對精靈碰撞後,它們都會從屏幕上消失。 二、場景層SKScene的修改 1、 在初始化場景層的方法中增加下麵代碼 self.physicsWorld.contactDelegate = self; self. ...
  • 蘋果在iOS6中禁用了[UIDevice uniqueIdentifier],在iOS7中又把mac地址的獲取給堵上了。沒辦法,畢竟人家是老大,說不讓你用,你也沒辦法。在這邊總結一下現有的一部分UDID獲取方法(有蘋果推薦的,也有第三方的),目的在於拋磚,沒有切實的說明哪種方法好用。用哪種方法,完全 ...
  • 1.當你在androidmanifest裡面定義了一個或多個action時 你使用隱式意圖其他activity或者service時,規定你隱式裡面的action必須匹配XML中定義的action,可以只匹配XML文件一個就行 2.當你在androidmanifest裡面定義了一個或多個categor ...
  • 項目簡介 小食光定位為一款集美食,社交,LBS服務於一體的美食推薦APP。為你發現周邊美食的同時提供一個吃貨分享的平臺。 APP截圖 功能模塊 美食推薦 :提供基礎的美食信息查詢; 商家推薦 : 基於用戶當前位置推薦周邊的人們店家; 百度地圖API :提供基礎的周邊店家檢索,定位服務; 美食分享:美 ...
  • 一:首先查看一下關於UITextView的定義 UITextView是繼承於UIScrollView,並且遵循UITextInput的協議;而UIScrollView是繼承於UIView,並且遵循NSCoding協議;上面有些屬性跟UITextField是一樣的,就沒有標註出來;關於UITextIn ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...