開發(fā)這個控件的緣由是因為目前做的App有一個對話框的功能,而蘋果提供的原生UITextField或者UITextView不符合對話框的需求(該控件可用于對話輸入框)菜枷。
限制
1苍糠,UITextFiled不能多行輸入
2,UITextView沒有占位符
3啤誊,2者都不能自動增高功能岳瞭。
重寫UITextView
1,為UITextView添加占位符
- (UITextView *)placeHolder {
if (_placeHolder == nil) {
UITextView *placeHolder = [[UITextView alloc] init];
_placeHolder = placeHolder;
placeHolder.userInteractionEnabled = NO;
placeHolder.showsVerticalScrollIndicator = NO;
placeHolder.showsHorizontalScrollIndicator = NO;
placeHolder.scrollEnabled = NO;
placeHolder.font = self.font;
placeHolder.backgroundColor= [UIColor clearColor];
placeHolder.textColor = [UIColor lightGrayColor];
[self addSubview:placeHolder];
}
return _placeHolder;
}
監(jiān)聽文本變化顯示或隱藏占位符
- (instancetype)init {
if (self = [super init]) {
// 添加文本變化通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangeText:) name:UITextViewTextDidChangeNotification object:nil];
}
return self;
}
2蚊锹,處理文本變化
自定義方法 didChangeText瞳筏,比如顯示隱藏站位文本,根據(jù)字符串計算最新高度
- (void)didChangeText:(NSNotification *)notification{
// 隱藏顯示占位符
self.scrollEnabled = self.placeHolder.hidden = self.hasText;
// 以防監(jiān)聽到非自己的文本變化
TBTextView *textView = notification.object;
if (textView == nil || textView != self || !self.tbDelegate || ![self.tbDelegate respondsToSelector:@selector(changeHeight:textString:textView:)]) return;
// 計算寬高
CGFloat height = [self.text boundingRectWithSize:CGSizeMake(self.frame.size.width - 10, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : self.font} context:nil].size.height + 0.5;// 加0.5以防顯示不全 -10是因為輸入框左右有邊距
// 記錄初始化高度
static BOOL firstTimeIn = YES;
if (firstTimeIn) {
firstTimeIn = NO;
_initHeight = self.bounds.size.height;
}
// 為什么取整牡昆? 因為有晃動的情況出現(xiàn)
NSInteger heigtInt = ceil(height);
CGFloat curHeight = heigtInt + self.textContainerInset.top + self.textContainerInset.bottom;
// 當(dāng)前高度比原始高度小
if (_initHeight > curHeight) {
curHeight = _initHeight;
}
// 不能超過最大高度
if (_maxLine > 0 && curHeight > _maxHeight ) {
curHeight = _maxHeight;
self.scrollEnabled = YES;
}else{
self.scrollEnabled = NO;
}
// 執(zhí)行代理
if ([self.tbDelegate respondsToSelector:@selector(changeHeight:textString:textView:)]) {
[self.tbDelegate changeHeight:curHeight textString:textView.text textView:textView];
}
}
3姚炕,代理返回新高度
// 執(zhí)行代理
if ([self.tbDelegate respondsToSelector:@selector(changeHeight:textString:textView:)]) {
[self.tbDelegate changeHeight:curHeight textString:textView.text textView:textView];
}
有些小細節(jié)需要注意下:
1,為什么用 UITextView 作占位符而不用UILabel丢烘,是因為UITextView可以與本身文字可以重疊一致
2柱宦,UITextView的上下有textContainerInset
3, 為什么取整播瞳? 因為有抖動的情況出現(xiàn)
NSInteger heigtInt = ceil(height);
CGFloat curHeight = heigtInt + self.textContainerInset.top + self.textContainerInset.bottom;