iOS 11では、入力時にスマートクォートが追加されます。 macOSでは、次のように設定することで、NSTextView
のスマートクォートを無効にできます。
textView.automaticQuoteSubstitutionEnabled = NO;
UITextField
もUITextView
も、このプロパティもenabledTextCheckingTypesプロパティも持っていないようです。 iOS 11でスマートクォートを無効にするにはどうすればよいですか?
スマートクォートとスマートダッシュなどの他の機能は、UITextInputTraits
とUITextField
の両方で採用されている UITextView
Protocol によって制御されます。
具体的には、smartQuotesType
プロパティを.default
、.yes
、または.no
のいずれかに設定できます。現時点では、これらの値に関するドキュメントはありませんが、.yes
および.no
は自明です。 .default
についての私の推測では、システムはtextContentType
やisSecureTextEntry
などのプロパティを使用して適切な動作を決定します。
たとえば、電子メール、パスワード、またはURLのテキストコンテンツタイプは、おそらくデフォルトでスマートクォートを無効にしますが、役職はデフォルトで有効になる場合があります。安全なテキスト入力フィールドでも、デフォルトでsmartが無効になると思います。
入力ビューに適切なテキストコンテンツタイプを設定すると、ユーザーエクスペリエンスが大幅に向上するため、強くお勧めします。
一部の言語では、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;
}
だから私はメソッドのスウィズリングによってこれらの機能を永久に無効にしようとしました:
#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を頻繁に使用しています。設定で「スマートパンクチュエーション」をオフにしても機能する。