作者:姓陈的女青年 | 来源:互联网 | 2023-01-30 13:55
iOS 11在输入时添加了智能引号.在macOS中,我们可以NSTextView
通过设置禁用智能引号:
textView.automaticQuoteSubstitutiOnEnabled= NO;
既没有UITextField
或UITextView
似乎没有此属性或enabledTextCheckingTypes属性.如何在iOS 11上禁用智能引号?
1> Paulw11..:
智能引号和其他功能(如智能破折号)通过UITextInputTraits
协议控制,协议由两者UITextField
和UITextView
.
具体而言,smartQuotesType
属性可以被设置为一个.default
,.yes
或.no
.目前没有关于这些值的进一步文档,但是.yes
并且.no
不言自明.我的猜测.default
是系统将使用诸如textContentType
和之类的属性isSecureTextEntry
来确定适当的行为.
例如,文本内容类型的电子邮件,密码或URL可能默认禁用智能引号,而作业标题可能默认启用.我想安全文本输入字段也会默认禁用智能.
为输入视图设置适当的文本内容类型可以显着改善用户体验,强烈建议使用.
我还要补充一点,它只能阻止从键盘输入智能引号.但是,用户可以从另一个应用程序中键入智能引用,并将其复制/粘贴到您的`smartQuotesType = .no`文本字段中."真正"阻止智能引号的最佳方法是实现委托`textField:shouldChangeCharactersInRange:replacementString:`并检测智能引号并将其替换为普通撇号.
2> 小智..:
我不认为smartQuotesType
并且smartQuotesType
是某些语言的好习惯.
为我们的应用中的每个文本输入设置以下属性:
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
@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
黑客私有方法总是像魅力一样......