iOS 11 在输入时增加了智能引号。在 macOS 中,我们可以通过设置来禁用 NSTextView
上的智能引号:
textView.automaticQuoteSubstitutionEnabled = NO;
在iOS 11上,似乎UITextField
和UITextView
都没有此属性或enabledTextCheckingTypes
属性。如何禁用智能引号?
iOS 11 在输入时增加了智能引号。在 macOS 中,我们可以通过设置来禁用 NSTextView
上的智能引号:
textView.automaticQuoteSubstitutionEnabled = NO;
在iOS 11上,似乎UITextField
和UITextView
都没有此属性或enabledTextCheckingTypes
属性。如何禁用智能引号?
智能引号和其他类似的功能,如智能破折号,是通过 UITextInputTraits
协议来控制的,该协议被 UITextField
和 UITextView
都采用。
具体而言,smartQuotesType
属性可以设置为 .default
、.yes
或 .no
中的一个。目前还没有关于这些值的进一步文档,但是 .yes
和 .no
很容易理解。我对 .default
的猜测是系统将使用属性如 textContentType
和 isSecureTextEntry
来确定适当的行为。
例如,电子邮件、密码或 URL 的文本内容类型可能会默认禁用智能引号,而职位名称可能默认启用。我想安全文本输入字段也会默认禁用智能功能。
为您的输入视图设置适当的文本内容类型可以显著提高用户体验,并且强烈建议这样做。
我认为对于某些语言,smartQuotesType
和smartQuotesType
不是一个好的实践。
在我们的应用程序中为每个文本输入设置这些属性:
if (@available(iOS 11.0, *)) {
textView.smartDashesType = UITextSmartDashesTypeNo;
textView.smartQuotesType = UITextSmartQuotesTypeNo;
textView.smartInsertDeleteType = UITextSmartInsertDeleteTypeNo;
} else {
// Fallback on earlier versions
}
- (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
我在这方面遇到了问题 - 我经常使用我的iPad Pro通过Prompt和NX。 在设置中关闭“智能标点符号”即可解决问题。
smartQuotesType
仅在 iOS11 中可用。Apple 文档 - Mr SpiegelsmartQuotesType = .no
文本字段中。真正防止智能引号的最佳方法是实现委托textField:shouldChangeCharactersInRange:replacementString:
,检测智能引号并用普通的撇号替换它。 - micnguyen