web-dev-qa-db-fra.com

iOS 11 - désactiver les devis intelligents

iOS 11 ajoute des citations intelligentes lors de la frappe. Sous macOS, nous pouvons désactiver les guillemets intelligents sur un NSTextView en définissant:

textView.automaticQuoteSubstitutionEnabled = NO;  

Ni UITextField ni UITextView ne semblent avoir cette propriété ou la propriété enabledTextCheckingTypes. Comment désactiver les devis intelligents sur iOS 11?

15
Kyle

Les citations intelligentes et d'autres fonctionnalités telles que les tirets intelligents sont contrôlées via le UITextInputTraits Protocol qui est adopté à la fois par UITextField et UITextView.

Plus précisément, la propriété smartQuotesType peut être définie sur l'un des .default, .yes ou .no. Pour le moment, il n'y a pas de documentation supplémentaire sur ces valeurs, mais .yes et .no sont explicites. Ma conjecture sur .default signifie que le système utilisera des propriétés telles que textContentType et isSecureTextEntry pour déterminer le comportement approprié.

Par exemple, un type de contenu de texte d'e-mail, de mot de passe ou d'URL désactiverait probablement les guillemets intelligents par défaut tandis que le titre du travail peut être activé par défaut. J'imagine que les champs de saisie de texte sécurisés auraient également désactivé l'intelligence par défaut.

La définition d'un type de contenu texte approprié pour vos vues d'entrée peut améliorer considérablement l'expérience utilisateur et est fortement recommandée.

23
Paulw11

Je ne pense pas que smartQuotesType et smartQuotesType soient de bonnes pratiques pour certaines langues.

Définissez ces propriétés pour chaque entrée de texte dans notre application:

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

Créer une catégorie pour désactiver ces fonctionnalités "SMART" n'a aucun sens (bug):

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

J'ai donc essayé de désactiver ces fonctionnalités de manière permanente par méthode 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

Le piratage de méthodes privées fonctionne toujours comme un charme ...

6
i_82

J'ai eu un problème avec cela - j'utilise fréquemment Prompt et NX via mon iPad Pro. La désactivation de la "ponctuation intelligente" dans les paramètres a fonctionné.

1
Tom