工作中碰到UITextField輸入中文會(huì)下沉的現(xiàn)象,雖然用一些方式解決髓梅,但是實(shí)際發(fā)生的具體原因及為何引發(fā)的并不是很清楚枯饿,抽空探究下奢方。
復(fù)現(xiàn):
[self.view addSubview:self.textfield];
[_textfield mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.view).offset(20);
make.right.equalTo(self.view).offset(-20);
make.top.equalTo(self.view).offset(50);
make.height.mas_equalTo(40);
}];
// 文字修改監(jiān)聽(tīng)
[_textfield addTarget:self action:@selector(textDidChange) forControlEvents:UIControlEventEditingChanged];
// 監(jiān)聽(tīng)處理
- (void)textDidChange {
if (_textfield.text.length >= 80) {
NSString *text = [_textfield.text substringToIndex:20];
_textfield.text = text;
}
}
當(dāng)文字大于一屏幕,繼續(xù)輸入/黏貼鹊奖,中文字符就會(huì)下沉嫉入,經(jīng)過(guò)反復(fù)測(cè)試咒林,當(dāng)調(diào)用
_textfield.text = text 垫竞,或者delete時(shí)欢瞪,并且文字超過(guò)一定字?jǐn)?shù)時(shí)遣鼓,會(huì)出現(xiàn)文字下沉骑祟。
中文下沉.gif
下面先說(shuō)解決方案:
1.創(chuàng)建MyTextField 繼承 UITextFiield,重寫(xiě) layoutSubviews方法怯晕,如下
@implementation MyTextField
- (void)layoutSubviews
{
[super layoutSubviews];
for (UIScrollView *view in self.subviews) {
if ([view isKindOfClass:[UIScrollView class]]) {
CGPoint offset = view.contentOffset;
if (offset.y != 0) {
offset.y = 0;
view.contentOffset = offset;
}
break;
}
}
}
分析原因:
log對(duì)比.png
打印兩種狀態(tài)下的視圖,發(fā)現(xiàn)下沉的視圖的contentOffset 有偏移吧凉。結(jié)合上述代碼客燕,來(lái)修復(fù)iOS的bug也搓。
等等傍妒,你以為中文下沉就這樣解決了颤练?too young too simple
你試試調(diào)用 textfield 的 deleteBackward。
這個(gè)問(wèn)題宇挫,我的解決方案是酪术,不調(diào)用deleteBackward橡疼,調(diào)用setText
可以留下你們的解決方案欣除,大家一起探討耻涛。