在開發中UITextField和UITextview這兩個元件用的是非常頻繁的,而且還要限制輸入框的字數,UITextview要設定placeholder等,每個控制元件都要實現代理方法寫相應的邏輯程式碼。是不是很麻煩?
很多新手是這樣寫的:
// 限制字數
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
if ([text isEqualToString:@""]) {
return YES;
}
if (textView.text.length > 5) {
return NO;
}
return YES;
}複製程式碼
這樣寫會有問題,當輸入中文或貼上字元到文字框時問題就出來了。
#為此我重寫了UITextField和UITextview,實現一句話設定限制字數和placeholder。代理用block代替,使用更加方便靈活。
限制字數相關實現,完美解決剛提到的問題(UITextField和UITextview的實現思路一樣):
if (self.limitLength > 0) { // 限制長度
//獲取高亮部分
UITextRange *selectedRange = [textView markedTextRange];
UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];
// 沒有高亮選擇的字,則對已輸入的文字進行字數統計和限制
if (!position)
{
if (toBeString.length > self.limitLength)
{
NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:self.limitLength];
if (rangeIndex.length == 1)
{
textView.text = [toBeString substringToIndex:self.limitLength];
}
else
{
NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, self.limitLength)];
textView.text = [toBeString substringWithRange:rangeRange];
}
}
}
}複製程式碼
效果圖:
使用:
JHTextField *textField = [[JHTextField alloc] initWithFrame:CGRectMake(50, 50, 300, 44)];
textField.limitLength = 5;
textField.placeholder = @"請輸入~";
textField.layer.borderWidth = 1;
textField.layer.borderColor = [UIColor lightGrayColor].CGColor;
[self.view addSubview:textField];
JHTextView *textView = [[JHTextView alloc] initWithFrame:CGRectMake(50, 120, 300, 200)];
textView.limitLength = 10;
textView.placeholder = @"請輸入~";
textView.layer.borderWidth = 1;
textView.layer.borderColor = [UIColor lightGrayColor].CGColor;
[self.view addSubview:textView];
self.textView = textView;複製程式碼
demo地址:github.com/iOSHJH/Inpu…
另外說到輸入框必然就會想到鍵盤擋住輸入框怎麼辦?為此我隆重介紹一個輕量級的鍵盤管理器,一句話設定當前控制器的view跟隨鍵盤起伏,媽媽再也不用擔心鍵盤擋住輸入框了,地址:juejin.im/post/59cb75…
有問題歡迎issues,若專案對你有用還望不吝給個star讓我動力十足?