iOS 11 - 禁用智能引号

时间:2017-07-05 17:47:08

标签: ios uitextfield uitextview ios11

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

来禁用DataFrame上的智能引号
NSTextView

textView.automaticQuoteSubstitutionEnabled = NO; UITextField似乎都没有此属性或enabledTextCheckingTypes属性。如何在iOS 11上禁用智能引号?

3 个答案:

答案 0 :(得分:21)

智能引号和其他功能(如智能破折号)通过UITextFieldUITextView采用的UITextInputTraits Protocol进行控制。

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

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

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

答案 1 :(得分:5)

我认为smartQuotesTypesmartQuotesType是某些语言的良好做法。

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

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 <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

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

答案 2 :(得分:2)

我遇到了问题 - 我经常通过iPad Pro使用Prompt和NX。关闭设置中的“智能标点符号”。