web-dev-qa-db-ja.com

iOS 11-スマートクォートを無効にする

iOS 11では、入力時にスマートクォートが追加されます。 macOSでは、次のように設定することで、NSTextViewのスマートクォートを無効にできます。

textView.automaticQuoteSubstitutionEnabled = NO;  

UITextFieldUITextViewも、このプロパティもenabledTextCheckingTypesプロパティも持っていないようです。 iOS 11でスマートクォートを無効にするにはどうすればよいですか?

15
Kyle

スマートクォートとスマートダッシュなどの他の機能は、UITextInputTraitsUITextFieldの両方で採用されている UITextView Protocol によって制御されます。

具体的には、smartQuotesTypeプロパティを.default.yes、または.noのいずれかに設定できます。現時点では、これらの値に関するドキュメントはありませんが、.yesおよび.noは自明です。 .defaultについての私の推測では、システムはtextContentTypeisSecureTextEntryなどのプロパティを使用して適切な動作を決定します。

たとえば、電子メール、パスワード、またはURLのテキストコンテンツタイプは、おそらくデフォルトでスマートクォートを無効にしますが、役職はデフォルトで有効になる場合があります。安全なテキスト入力フィールドでも、デフォルトでsmartが無効になると思います。

入力ビューに適切なテキストコンテンツタイプを設定すると、ユーザーエクスペリエンスが大幅に向上するため、強くお勧めします。

23
Paulw11

一部の言語では、smartQuotesTypesmartQuotesTypeは良い習慣ではないと思います。

アプリのすべてのテキスト入力にこれらのプロパティを設定します。

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

プライベートメソッドのハッキングは常に魅力のように機能します...

6
i_82

私はこれに問題がありました-私はiPad Proを介してPromptとNXを頻繁に使用しています。設定で「スマートパンクチュエーション」をオフにしても機能する。

1
Tom