iOS 簡易文本控件開發(UIKeyInput協議學習)


有時候由於特殊原因,不想去用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 }

------------------------------------------------------------------------------------------------------------------------------------------------------

要實現支持中文輸入,閃爍光標和選區功能的文本控件比較復雜,下次再寫吧......

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM