web-dev-qa-db-ja.com

UITextFieldのカーソルを非表示にします

UITextFieldUIPickerViewとともにinputViewを使用しているため、ユーザーがテキストフィールドをタップすると、オプションを選択するためにピッカーが呼び出されます。

ほぼすべてが機能しますが、1つの問題があります。アクティブになっているときにテキストフィールドでカーソルが点滅し続けます。ユーザーがフィールドに入力する必要がなく、キーボードが表示されないため、見苦しくて不適切です。テキストフィールドでeditingNOに設定してタッチを追跡するか、カスタムスタイルのボタンに置​​き換え、コードを介してピッカーを呼び出すことで、これを簡単に解決できることを知っています。ただし、テキストフィールドでのすべてのイベント処理にUITextFieldDelegateメソッドを使用し、テキストフィールドをボタンに置​​き換えるなどのハックはこのアプローチを許可しません。

代わりにUITextFieldのカーソルを単純に非表示にするにはどうすればよいですか?

120
emenegro

UITextFieldをサブクラス化し、caretRectForPositionをオーバーライドするだけです

- (CGRect)caretRectForPosition:(UITextPosition *)position
{
    return CGRectZero;
}
258
Joseph Chiu

IOS 7の時点で、tintColor = [UIColor clearColor]のtextFieldとキャレットが消えます。

148
jamone

テキストフィールドのtintColorをクリアするだけです

self.textField.tintColor = [UIColor clearColor];

Swift 3.

self.textField.tintColor = .clear

enter image description here

83
oldman

また、ユーザーがテキストを選択、コピー、または貼り付けないようにして、ピッカービューからのみテキスト入力が行われるようにすることもできます。

- (CGRect) caretRectForPosition:(UITextPosition*) position
{
    return CGRectZero;
}

- (NSArray *)selectionRectsForRange:(UITextRange *)range
{
    return nil;
}

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if (action == @selector(copy:) || action == @selector(selectAll:) || action == @selector(paste:))
    {
        returnNO;
    }

    return [super canPerformAction:action withSender:sender];
}

http://b2cloud.com.au/tutorial/disabling-the-caret-and-text-entry-in-uitextfields/

20
Nat

propertyselectedTextRangeプロトコルUITextInput 、これにclassUITextField 適合。少ない!これは、オブジェクト指向プログラミングの教訓です。

キャレットを隠す

キャレットを非表示にするには、テキストフィールドの選択したテキスト範囲を消去します。

textField.selectedTextRange = nil; // hides caret

キャレットの再表示

キャレットを再表示する方法は2つあります。

  1. テキストフィールドの選択したテキスト範囲をドキュメントの最後に設定します。

    UITextPosition *end = textField.endOfDocument;
    textField.selectedTextRange = [textField textRangeFromPosition:end
                                                        toPosition:end];
    
  2. キャレットを同じ場所に保持するには、まず、テキストフィールドで選択したテキスト範囲をインスタンス変数に保存します。

    _textFieldSelectedTextRange = textField.selectedTextRange;
    textField.selectedTextRange = nil; // hides caret
    

    次に、キャレットを再表示する場合は、テキストフィールドで選択したテキスト範囲を元の状態に戻すだけです。

    textField.selectedTextRange     = _textFieldSelectedTextRange;
    _textFieldLastSelectedTextRange = nil;
    
14
ma11hew28

OPが提供する回答。未回答の質問の増え続ける末尾をクリーンアップするために質問本文からコピーされます。

別の解決策を見つけました:サブクラスUIButtonおよびこれらのメソッドをオーバーライドします

- (UIView *)inputView {
    return inputView_;
}

- (void)setInputView:(UIView *)anInputView {
    if (inputView_ != anInputView) {
        [inputView_ release];
        inputView_ = [anInputView retain];
    }
}

- (BOOL)canBecomeFirstResponder {
    return YES;
}

これで、ボタンはUIResponderとして、UITextFieldと同様の動作をし、実装は非常に簡単です。

10
Robert Höglund

Netの投稿のSwift 3バージョン

  override func caretRect(for position: UITextPosition) -> CGRect {
    return .zero
  }

  override func selectionRects(for range: UITextRange) -> [Any] {
    return []
  }

  override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
    return false
  }
5
Rom.

カーソルとメニューの両方を無効にするには、次の2つのメソッドでサブクラスを使用します。

- (CGRect)caretRectForPosition:(UITextPosition *)position {
    return CGRectZero;
}

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    [UIMenuController sharedMenuController].menuVisible = NO;
    self.selectedTextRange = nil;

    return NO;
}
1
Vive

OPが提供する回答。未回答の質問の増え続ける末尾をクリーンアップするために質問本文からコピーされます。

私は正しい解決策を持っていると思いますが、改善できる場合は大歓迎です:)さて、UITextFieldのサブクラスを作成し、境界のCGRectを返すメソッドをオーバーライドします

-(CGRect)textRectForBounds:(CGRect)bounds {
    return CGRectZero;
}

問題?四角形がゼロのため、テキストは表示されません。ただし、UILabelをコントロールのサブビューとして追加し、setTextメソッドをオーバーライドしたため、通常どおりテキストを入力すると、テキストフィールドのテキストはnilになり、テキストを表示するラベルになります

- (void)setText:(NSString *)aText {
    [super setText:nil];

    if (aText == nil) {
        textLabel_.text = nil;
    }

    if (![aText isEqualToString:@""]) {
        textLabel_.text = aText;
    }
}

これにより、期待どおりに動作します。それを改善する方法を知っていますか?

1
Robert Höglund

tintColorをClear Colorに設定します

textfield.tintColor = [UIColor clearColor];

また、インターフェイスビルダーから設定することもできます

1
Ahmad Al-Attal

カーソルを非表示にする場合は、簡単に使用できます!それは私のために働いた..

[[textField valueForKey:@"textInputTraits"] setValue:[UIColor clearColor] forKey:@"insertionPointColor"]
1
Göktuğ Aral

私は単純にUITextFieldをサブクラス化し、次のようにlayoutSubviewsをオーバーライドします。

- (void)layoutSubviews
{
    [super layoutSubviews];
    for (UIView *v in self.subviews)
    {
        if ([[[v class] description] rangeOfString:@"UITextSelectionView"].location != NSNotFound)
        {
            v.hidden = YES;
        }
    }
}

これは汚いハックであり、将来失敗する可能性があります(その時点でカーソルが再び表示されます-アプリはクラッシュしません)が、動作します。

0
Mark Beaton