工作中碰到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)聽
[_textfield addTarget:self action:@selector(textDidChange) forControlEvents:UIControlEventEditingChanged];
// 監(jiān)聽處理
- (void)textDidChange {
if (_textfield.text.length >= 80) {
NSString *text = [_textfield.text substringToIndex:20];
_textfield.text = text;
}
}
當(dāng)文字大于一屏幕,繼續(xù)輸入/黏貼,中文字符就會(huì)下沉,經(jīng)過反復(fù)測(cè)試,當(dāng)調(diào)用
_textfield.text = text ,或者delete時(shí),并且文字超過一定字?jǐn)?shù)時(shí),會(huì)出現(xiàn)文字下沉。
中文下沉.gif
下面先說解決方案:
1.創(chuàng)建MyTextField 繼承 UITextFiield,重寫 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é)合上述代碼,來修復(fù)iOS的bug。
等等,你以為中文下沉就這樣解決了?too young too simple
你試試調(diào)用 textfield 的 deleteBackward。
這個(gè)問題,我的解決方案是,不調(diào)用deleteBackward,調(diào)用setText
可以留下你們的解決方案,大家一起探討。