探究UITextField 中文下沉

工作中碰到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时,并且文字超过一定字数时,会出现文字下沉。

中文下沉.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;
        }
    }
}

分析原因:


log对比.png

打印两种状态下的视图,发现下沉的视图的contentOffset 有偏移。结合上述代码,来修复iOS的bug。

等等,你以为中文下沉就这样解决了?too young too simple

你试试调用 textfield 的 deleteBackward。
这个问题,我的解决方案是,不调用deleteBackward,调用setText

可以留下你们的解决方案,大家一起探讨。

参考文献:
https://stackoverflow.com/questions/39556087/uitextfield-chinese-character-moves-down-when-editing-in-ios-10/40056137#40056137

你可能感兴趣的:(探究UITextField 中文下沉)