美文网首页iOS Developer
探究UITextField 中文下沉

探究UITextField 中文下沉

作者: 杰克大王 | 来源:发表于2017-06-10 22:38 被阅读58次

    工作中碰到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 中文下沉

        本文链接:https://www.haomeiwen.com/subject/wrrcqxtx.html