工作中碰到UITextField输入中文会下沉的现象,虽然用一些方式解决,但是实际发生的具体原因及为何引发的并不是很清楚,抽空探究下。
复现:
[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);
}];
// 文字修改监听
[_textfield addTarget:self action:@selector(textDidChange) forControlEvents:UIControlEventEditingChanged];
// 监听处理
- (void)textDidChange {
if (_textfield.text.length >= 80) {
NSString *text = [_textfield.text substringToIndex:20];
_textfield.text = text;
}
}
当文字大于一屏幕,继续输入/黏贴,中文字符就会下沉,经过反复测试,当调用
_textfield.text = text ,或者delete时,并且文字超过一定字数时,会出现文字下沉。
![](https://img.haomeiwen.com/i1280419/5a66fa76b67a07b0.gif)
下面先说解决方案:
1.创建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;
}
}
}
分析原因:
![](https://img.haomeiwen.com/i1280419/1a0f46f7a8ef8afe.png)
打印两种状态下的视图,发现下沉的视图的contentOffset 有偏移。结合上述代码,来修复iOS的bug。
等等,你以为中文下沉就这样解决了?too young too simple
你试试调用 textfield 的 deleteBackward。
这个问题,我的解决方案是,不调用deleteBackward,调用setText
可以留下你们的解决方案,大家一起探讨。
网友评论