iOS 11 - 禁用弯引号

iOS 11 - disable smart quotes

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

textView.automaticQuoteSubstitutionEnabled = NO;  

UITextFieldUITextView 似乎都没有这个 属性 或 enabledTextCheckingTypes 属性。如何在 iOS 11 上禁用智能引号?

智能引号和智能破折号等其他功能是通过 UITextInputTraits Protocol 控制的,UITextFieldUITextView 都采用了 UITextInputTraits Protocol

具体来说,smartQuotesType 属性 可以设置为 .default.yes.no 之一。目前没有关于这些值的进一步文档,但 .yes.no 是不言自明的。我对 .default 的猜测是系统将使用 textContentTypeisSecureTextEntry 等属性来确定适当的行为。

例如,电子邮件、密码或 URL 等文本内容类型可能默认禁用智能引号,而职位可能默认启用。我想安全文本输入字段也会默认禁用智能功能。

为您的输入视图设置适当的文本内容类型可以显着改善用户体验,强烈推荐。

我对此有疑问 - 我经常通过我的 iPad Pro 使用 Prompt 和 NX。在设置中关闭 "smart punctuation" 有效。

我认为 smartQuotesTypesmartQuotesType 对某些语言来说不是好的做法。

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

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

创建类别以禁用这些 "SMART" 功能毫无意义(错误):

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

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

#import <objc/runtime.h>

@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

破解私有方法总是很有魅力...