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?
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.
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 ...
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é.