UITextField
にUIPickerView
とともにinputView
を使用しているため、ユーザーがテキストフィールドをタップすると、オプションを選択するためにピッカーが呼び出されます。
ほぼすべてが機能しますが、1つの問題があります。アクティブになっているときにテキストフィールドでカーソルが点滅し続けます。ユーザーがフィールドに入力する必要がなく、キーボードが表示されないため、見苦しくて不適切です。テキストフィールドでediting
をNO
に設定してタッチを追跡するか、カスタムスタイルのボタンに置き換え、コードを介してピッカーを呼び出すことで、これを簡単に解決できることを知っています。ただし、テキストフィールドでのすべてのイベント処理にUITextFieldDelegate
メソッドを使用し、テキストフィールドをボタンに置き換えるなどのハックはこのアプローチを許可しません。
代わりにUITextField
のカーソルを単純に非表示にするにはどうすればよいですか?
UITextFieldをサブクラス化し、caretRectForPositionをオーバーライドするだけです
- (CGRect)caretRectForPosition:(UITextPosition *)position
{
return CGRectZero;
}
IOS 7の時点で、tintColor = [UIColor clearColor]
のtextFieldとキャレットが消えます。
テキストフィールドのtintColorをクリアするだけです
self.textField.tintColor = [UIColor clearColor];
Swift 3.
self.textField.tintColor = .clear
また、ユーザーがテキストを選択、コピー、または貼り付けないようにして、ピッカービューからのみテキスト入力が行われるようにすることもできます。
- (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/
propertyselectedTextRange
のプロトコルUITextInput
、これにclassUITextField
適合。少ない!これは、オブジェクト指向プログラミングの教訓です。
キャレットを隠す
キャレットを非表示にするには、テキストフィールドの選択したテキスト範囲を消去します。
textField.selectedTextRange = nil; // hides caret
キャレットの再表示
キャレットを再表示する方法は2つあります。
テキストフィールドの選択したテキスト範囲をドキュメントの最後に設定します。
UITextPosition *end = textField.endOfDocument;
textField.selectedTextRange = [textField textRangeFromPosition:end
toPosition:end];
キャレットを同じ場所に保持するには、まず、テキストフィールドで選択したテキスト範囲をインスタンス変数に保存します。
_textFieldSelectedTextRange = textField.selectedTextRange;
textField.selectedTextRange = nil; // hides caret
次に、キャレットを再表示する場合は、テキストフィールドで選択したテキスト範囲を元の状態に戻すだけです。
textField.selectedTextRange = _textFieldSelectedTextRange;
_textFieldLastSelectedTextRange = nil;
OPが提供する回答。未回答の質問の増え続ける末尾をクリーンアップするために質問本文からコピーされます。
別の解決策を見つけました:サブクラスUIButton
およびこれらのメソッドをオーバーライドします
- (UIView *)inputView {
return inputView_;
}
- (void)setInputView:(UIView *)anInputView {
if (inputView_ != anInputView) {
[inputView_ release];
inputView_ = [anInputView retain];
}
}
- (BOOL)canBecomeFirstResponder {
return YES;
}
これで、ボタンはUIResponder
として、UITextField
と同様の動作をし、実装は非常に簡単です。
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
}
カーソルとメニューの両方を無効にするには、次の2つのメソッドでサブクラスを使用します。
- (CGRect)caretRectForPosition:(UITextPosition *)position {
return CGRectZero;
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
[UIMenuController sharedMenuController].menuVisible = NO;
self.selectedTextRange = nil;
return NO;
}
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;
}
}
これにより、期待どおりに動作します。それを改善する方法を知っていますか?
tintColorをClear Colorに設定します
textfield.tintColor = [UIColor clearColor];
また、インターフェイスビルダーから設定することもできます
カーソルを非表示にする場合は、簡単に使用できます!それは私のために働いた..
[[textField valueForKey:@"textInputTraits"] setValue:[UIColor clearColor] forKey:@"insertionPointColor"]
私は単純にUITextField
をサブクラス化し、次のようにlayoutSubviews
をオーバーライドします。
- (void)layoutSubviews
{
[super layoutSubviews];
for (UIView *v in self.subviews)
{
if ([[[v class] description] rangeOfString:@"UITextSelectionView"].location != NSNotFound)
{
v.hidden = YES;
}
}
}
これは汚いハックであり、将来失敗する可能性があります(その時点でカーソルが再び表示されます-アプリはクラッシュしません)が、動作します。