探究UITextField 中文下沉

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

可以留下你們的解決方案,大家一起探討。

參考文獻(xiàn):
https://stackoverflow.com/questions/39556087/uitextfield-chinese-character-moves-down-when-editing-in-ios-10/40056137#40056137

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容