iOS 11 - 禁用弯引号
iOS 11 - disable smart quotes
iOS 11 输入时添加引号。在 macOS 中,我们可以通过设置 NSTextView
禁用弯引号:
textView.automaticQuoteSubstitutionEnabled = NO;
UITextField
或 UITextView
似乎都没有这个 属性 或 enabledTextCheckingTypes 属性。如何在 iOS 11 上禁用智能引号?
智能引号和智能破折号等其他功能是通过 UITextInputTraits
Protocol 控制的,UITextField
和 UITextView
都采用了 UITextInputTraits
Protocol。
具体来说,smartQuotesType
属性 可以设置为 .default
、.yes
或 .no
之一。目前没有关于这些值的进一步文档,但 .yes
和 .no
是不言自明的。我对 .default
的猜测是系统将使用 textContentType
和 isSecureTextEntry
等属性来确定适当的行为。
例如,电子邮件、密码或 URL 等文本内容类型可能默认禁用智能引号,而职位可能默认启用。我想安全文本输入字段也会默认禁用智能功能。
为您的输入视图设置适当的文本内容类型可以显着改善用户体验,强烈推荐。
我对此有疑问 - 我经常通过我的 iPad Pro 使用 Prompt 和 NX。在设置中关闭 "smart punctuation" 有效。
我认为 smartQuotesType
和 smartQuotesType
对某些语言来说不是好的做法。
为我们应用中的每个文本输入设置这些属性:
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
破解私有方法总是很有魅力...
iOS 11 输入时添加引号。在 macOS 中,我们可以通过设置 NSTextView
禁用弯引号:
textView.automaticQuoteSubstitutionEnabled = NO;
UITextField
或 UITextView
似乎都没有这个 属性 或 enabledTextCheckingTypes 属性。如何在 iOS 11 上禁用智能引号?
智能引号和智能破折号等其他功能是通过 UITextInputTraits
Protocol 控制的,UITextField
和 UITextView
都采用了 UITextInputTraits
Protocol。
具体来说,smartQuotesType
属性 可以设置为 .default
、.yes
或 .no
之一。目前没有关于这些值的进一步文档,但 .yes
和 .no
是不言自明的。我对 .default
的猜测是系统将使用 textContentType
和 isSecureTextEntry
等属性来确定适当的行为。
例如,电子邮件、密码或 URL 等文本内容类型可能默认禁用智能引号,而职位可能默认启用。我想安全文本输入字段也会默认禁用智能功能。
为您的输入视图设置适当的文本内容类型可以显着改善用户体验,强烈推荐。
我对此有疑问 - 我经常通过我的 iPad Pro 使用 Prompt 和 NX。在设置中关闭 "smart punctuation" 有效。
我认为 smartQuotesType
和 smartQuotesType
对某些语言来说不是好的做法。
为我们应用中的每个文本输入设置这些属性:
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
破解私有方法总是很有魅力...