有時候由於特殊原因,不想去用ios系統的默認輸入控件如UITextView等,此時則需要自己定制文本控件。
下面步驟最后形成的控件,僅支持英文字符輸入,其余功能比如插入符閃爍,文本選擇等等都不具備!
1.首先,要新建一個繼承UIView的類。並聲明如下幾個類型的屬性,用來記錄一個文本控件內容:
1 @interface SIPTextView : UIView<UIKeyInput> 2 { 3 NSMutableString *textStore; 4 UIFont *font; 5 UIColor *textColor; 6 } 7 @property (nonatomic, retain) NSMutableString *textStore; 8 @property (nonatomic, retain) UIColor *textColor; 9 @property (nonatomic, retain) UIFont *font;
在init方法中可以初始化這些數據:
- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor whiteColor]; self.textColor = [UIColor blackColor]; self.font = [UIFont boldSystemFontOfSize:12.0f]; self.textStore = [NSMutableString string]; } return self; }
2.接着讓這個類實現協議UIKeyInput,協議聲明詳情如下:
@protocol UIKeyInput <UITextInputTraits> - (BOOL)hasText; - (void)insertText:(NSString *)text; - (void)deleteBackward; @end
協議中insertText方法會在用戶在此控件有鍵盤輸入時被調用,我們要在此記錄輸入的文本信息。deleteBackward方法會在用戶想按鍵刪除一個輸入字符時被調用,我們要在此刪除一個字符:
#pragma mark UIKeyInput protocol -(void)insertText:(NSString *)text { [textStore appendString:text]; //呼喚重繪 [self setNeedsDisplay]; } - (BOOL)hasText { return textStore.length > 0; } - (void)deleteBackward { if ([textStore length] == 0) { return; } NSRange theRange = NSMakeRange(textStore.length - 1, 1); [textStore deleteCharactersInRange:theRange]; //呼喚重繪 [self setNeedsDisplay]; }
由於默認情況下控件無法成為第一響應者,所以必須更改此設置,並讓其在被點擊時成為第一響應者:
1 - (BOOL)canBecomeFirstResponder { 2 return YES; 3 } 4 5 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 6 if (![self isFirstResponder]) { 7 [self becomeFirstResponder]; 8 } 9 }
目前為止,此視圖已經可以正常接收鍵盤輸入消息了(可在insertText方法log出來看)。
3.最后一步是把存儲了鍵盤輸入信息的文本屬性顯示出來,重寫視圖的drawRect方法如下:
1 - (CGRect)rectForTextWithInset:(CGFloat)inset { 2 return CGRectInset(self.bounds, inset, inset); 3 } 4 5 - (void)drawRect:(CGRect)rect { 6 CGRect rectForText = [self rectForTextWithInset:8.0f]; 7 //設置當前繪制顏色 8 [textColor set]; 9 //繪制矩形框邊緣,UIRectFill(rect)則繪制矩形內部 10 //UIRectFrame(rect); 11 //一般用NSString的內置draw方法繪制文字 12 [textStore drawInRect:rectForText withFont:font]; 13 }
以上就是定制簡易文本控件所有步驟。
------------------------------------------------------------------------------------------------------------------------------------------------------
由於UIKeyInput協議遵循UITextInputTraits協議(此協議可以自行查閱其相關方法),因此也可以為這個視圖設置鍵盤風格等,比如可以設置鍵盤類型為數字鍵盤:
1 - (UIKeyboardType)keyboardType { 2 return UIKeyboardTypeNumberPad; 3 }
------------------------------------------------------------------------------------------------------------------------------------------------------
要實現支持中文輸入,閃爍光標和選區功能的文本控件比較復雜,下次再寫吧......