热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS11-禁用智能引号

如何解决《iOS11-禁用智能引号》经验,为你挑选了2个好方法。

iOS 11在输入时添加了智能引号.在macOS中,我们可以NSTextView通过设置禁用智能引号:

textView.automaticQuoteSubstitutiOnEnabled= NO;  

既没有UITextFieldUITextView似乎没有此属性或enabledTextCheckingTypes属性.如何在iOS 11上禁用智能引号?



1> Paulw11..:

智能引号和其他功能(如智能破折号)通过UITextInputTraits协议控制,协议由两者UITextFieldUITextView.

具体而言,smartQuotesType属性可以被设置为一个.default,.yes.no.目前没有关于这些值的进一步文档,但是.yes并且.no不言自明.我的猜测.default是系统将使用诸如textContentType和之类的属性isSecureTextEntry来确定适当的行为.

例如,文本内容类型的电子邮件,密码或URL可能默认禁用智能引号,而作业标题可能默认启用.我想安全文本输入字段也会默认禁用智能.

为输入视图设置适当的文本内容类型可以显着改善用户体验,强烈建议使用.


我还要补充一点,它只能阻止从键盘输入智能引号.但是,用户可以从另一个应用程序中键入智能引用,并将其复制/粘贴到您的`smartQuotesType = .no`文本字段中."真正"阻止智能引号的最佳方法是实现委托`textField:shouldChangeCharactersInRange:replacementString:`并检测智能引号并将其替换为普通撇号.

2> 小智..:

我不认为smartQuotesType并且smartQuotesType是某些语言的好习惯.

为我们的应用中的每个文本输入设置以下属性:

if (@available(iOS 11.0, *)) {
    textView.smartDashesType = UITextSmartDashesTypeNo;
    textView.smartQuotesType = UITextSmartQuotesTypeNo;
    textView.smartInsertDeleteType = UITextSmartInsertDeleteTypeNo;
} else {
    // Fallback on earlier versions
}

创建一个类别来禁用这些"SMART"功能毫无意义(bug):

- (UITextSmartDashesType)smartDashesType {
    return UITextSmartDashesTypeNo;
}
- (UITextSmartQuotesType)smartQuotesType {
    return UITextSmartQuotesTypeNo;
}
- (UITextSmartInsertDeleteType)smartInsertDeleteType {
    return UITextSmartInsertDeleteTypeNo;
}

所以我尝试通过方法调配永久禁用这些功能:

#import 

@implementation DisableFuckingSmartPunctuation

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [objc_getClass("UITextInputController") class];
        Class myClass = [self class];

        SEL originalSelector = @selector(checkSmartPunctuationForWordInRange:);
        SEL swizzledSelector = @selector(checkSmartPunctuationForWordInRange:);

        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(myClass, swizzledSelector);

        BOOL didAddMethod =
        class_addMethod(class,
                        originalSelector,
                        method_getImplementation(swizzledMethod),
                        method_getTypeEncoding(swizzledMethod));

        if (didAddMethod) {
            class_replaceMethod(class,
                                swizzledSelector,
                                method_getImplementation(originalMethod),
                                method_getTypeEncoding(originalMethod));
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}

- (void)checkSmartPunctuationForWordInRange:(id)arg1 {

}

@end

黑客私有方法总是像魅力一样......


推荐阅读
author-avatar
姓陈的女青年
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有