UITextFieldとUITextViewのカーソル/キャレットの色を変更する


222

私は、カーソルの色/キャレットの変更について思ったんだけどUITextField(そしてUITextViewiOSの中でその同じ答えであれば)。OSX開発の答えを見てきましたが、iOSの答えはありません。

これは可能ですか?


1
Stackoverflow.com/a/18759577/1709587のUITextField Interface Builderでこれを行う方法を含む、の詳細な回答
Mark Amery

1
stackoverflow.com/a/18945907/1292230でのシンプルで完全な回答;)
RileyE 2014年

回答:


513

iOS 7以降をターゲットにしている場合、これははるかに簡単になりました。tintColor外観プロキシを使用してカーソルでフィールドのを変更するだけで、アプリ全体に適用されます。

Swift 3.0:

UITextField.appearance().tintColor = .black 

Objective-C:

[[UITextField appearance] setTintColor:[UIColor blackColor]];

同じ答えが個人にも当てはまりますUITextField

Swift 3.0:

myTextField.tintColor = .black 

Objective-C

[myTextField setTintColor:[UIColor blackColor]];

13
これにより、色合いの色をまったく異なるものに設定しても、UIBarButtonアイテムの色合いがデフォルト値に固定されることがわかりました。作成時にUITextFieldsの色合いを個別に設定することで問題を解決しました。
willtalmadge 2014年

これは機能しますが、didFinishLaunchingで実行した場合のみですか?または、ボタンを押すなど、ユーザーの操作に基づいてそれを行うことができますか?
Steffen Andersen

@SteffenAndersenは、UIAppearanceプロキシAPIドキュメントに従って動作する必要があります。
DiscDev 2014

[[UITextView外観] setTintColor:teal]; 何らかの理由で、これによりnavbarbuttonsの色が変更されました。
ジョン

3
Swift 3.0では、これを使用します。UITextField.appearance()。tintColor = UIColor.black
Lucas Torquato


20

スウィフト3:

  UITextField.appearance().tintColor = UIColor.black
  UITextView.appearance().tintColor = UIColor.black

1
Swift 3.0では、これを使用します。UITextField.appearance()。tintColor = UIColor.black
Lucas Torquato

13

注:この回答は古くなっており、iOS 7より前の開発にのみ使用してください。iOS 7でAppearance Proxyを使用する1行のソリューションについては、他の回答を参照してください。

私が取り組んでいるプロジェクトで同じ問題に直面した後、私はこの質問に到着しました。

既存のプライベートAPIを使用していないため、AppStoreレビューチームに受け入れられるソリューションを作成できました。

UITextFieldを拡張するDGTextFieldというコントロールを作成しました。


これは素晴らしい。正直なところ、このため、ドキュメント内の「準拠する」に注意を向けていきます。しかし、これを読んでいじくり回すのに1人しか時間をかけなくて良かったと思います。うまくいけば、他の人がこれを見て使用できるようになるでしょう!
RileyE 2013年

ただし、@ properyを削除して、カスタムキャレット幅のセッターとゲッターだけでなくセッターとゲッターを作成するだけのアニメーションオプションをお勧めします。あなたは興味がないかもしれませんが、私はいつも小さな調整が好きです!
RileyE 2013年

@RileyE私のソリューションから恩恵を受けられたことをうれしく思います。リポジトリをフォークして、共有したい微調整を自由に追加してください。
Dov

3
iOS 7の方がはるかに簡単です。以下の私の回答を参照してください:stackoverflow.com/a/18945907/1103584
DiscDev

12
yourTextField.tintColor = [UIColor whiteColor];

コードで設定すると機能します。「cosどういうわけか、カラートリガーはInterface Builder(Xcode 6.1.1)では機能しません。外観プロキシを変更する必要がなく、それはよく適しています。


2
不明な理由により、私はwhiteColorでは機能しませんが、他のすべての色で機能します(iOS 8でのテスト)。私はそれを機能させるために、ほとんど白ではないが白ではない色を設定する必要がありました。
Leszek Szary 2017

@LeszekSzaryねえ!あなたは私の日を救った!4時間近く試してみましたが、あなたの言葉がヒントになりました。Appleはこのクレイジーなバグを修正するべきであり、実際に開発者をクレイジーなものにします。
Karthick Ramesh

10

設定tintColorのためUITextFieldUITextView動作が異なります。一方、UITextField更新後にtintColorカーソルの色を変更するために追加のコードを呼び出す必要はありませんが、UITextView必要です。

したがってtintColorUITextView(IBまたはコードでは関係ありません)を設定した後、それtextView.tintColorDidChange()を適用するために呼び出す必要があります(実際には、テキストビューの構成をサブビュー階層に渡します)。


5

これは私にとって迅速に機能しました:

UITextField.tintColor = UIColor.blackColor()

これをストーリーボードで設定することもできますhttps : //stackoverflow.com/a/18759577/3075340


これは機能しません。エラーが発生しました:Instance member 'tintcolor' cannot be used on type 'UITextField'
pableiros

@pableiros上記はSwift 2に関するものでした。多分あなたは今Swift 3を使用していますか?
マイクロ

私はSwift 3と2.3を試してみましたが、Swift 2.2以下で機能するかどうか
わかり

3

より一般的なアプローチは、UIViewの外観のtintColorを設定することです。

UIColor *myColor = [UIColor purpleColor];
[[UIView appearance] setTintColor:myColor];

多くのデフォルトのUI要素を使用している場合は理にかなっています。


2
うーん...これには他にも多くの副作用があります...問題はキャレットの色を変更することだけです。あなたの答えはアプリ内のすべてのUIViewに色を付けることになります...これはおそらくほとんどの人が望むアプローチではありません取る。
DiscDev 2013年

+1すると、キャレットの色を変更するだけの場合は、副作用が多すぎます。コンテナーをスタイリングしているときにUIView tintColorを設定すると便利です(ただし、私は使用しません[UIView appearance]
colinta

2

試してみてください。

[[self.textField valueForKey:@"textInputTraits"] setValue:[UIColor redColor] strong textforKey:@"insertionPointColor"];

6
これはプライベートメソッドを使用していますが、提案をありがとうございます。これにより、アプリケーションが簡単に拒否される可能性があります。
RileyE 2013年


0

ダーゲッシュのアプローチは機能します。

私もそのようなKVCソリューションを何度も使用しました。文書化されていないようですが、動作します。率直に言って、ここではプライベートメソッドを使用せず、合法なKey-Valueコーディングのみを使用します。

PS昨日、私の新しいアプリはこのアプローチで問題なくAppStoreに登場しました。そして、いくつかの読み取り専用プロパティ(navigatonBarなど)またはプライベートivarを変更するときにKVCを使用するのは、これが最初のケースではありません。


1
プライベートメソッドを使用していませんが、キーは文書化されていません。つまり、App Storeのアプリケーションで使用することはできません。アプリケーションは主観的に拒否される場合があります。多くの人がその方法の使用を拒否されているため、親切なレビュー担当者がいたはずです。
RileyE 2013

それから私は約10人の親切な査読者を持っています:)と私の多くの同僚も。
マレックス2013

1
明確にするために、この場合の「キーと値のコーディング」は、便利なメソッドを使用してプロパティに値を割り当てることです。セッターではなく、それを使用する理由は、プロパティがアクセス不能/非表示/プライベートであるためです。
RileyE 2013

1
ここで私は(多分私は何か重要なことを知らないかもしれません)KVCに関するドキュメントが文字通り制限を意味しないことだけを意味します。だから私はこれらすべてをうまく使いました。そして、うまくいけば他の人ができます。
malex 2013

1
感謝。ただし、Appleは「利用規約」の中で、ドキュメントに含まれるものを使用し、公然と議論することが許可されており、ドキュメント化されていないメソッドの使用を禁止している(KVCを介した「textInputTraits」セッターメソッドへのアクセスは、プロパティは文書化されていません)。基本的に、ドキュメントにメソッドが見つからない場合は、禁止されています。ただし、禁止は拒否を保証するものではありません。一部のアプリがストアに掲載される理由で拒否されたことがあります。文書化されていないメソッドでは、うまくいきません。
RileyE 2013

0

Swiftを備えたInterface Builderバージョンの場合

@IBOutlet weak var tvValue: UITextView! {
        didSet {
            tvValue.tintColor = .black
        }
    }

0

UITextFieldfromの場合、UISearchBar最初にtextFieldfrom searchBarを取得してからtintColorプロパティを適用します。

let textFieldInsideSearchBar = searchBar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.tintColor = UIColor.lightGray

0

スウィフト4

viewDidLoad()で、以下のコードを呼び出します。

コードサンプル

//txtVComplaint is a textView

txtVComplaint.tintColor = UIColor.white

txtVComplaint.tintColorDidChange()

0

カスタムカラーが必要な場合は、Assets.xcassetsフォルダに移動し、右クリックして選択します。New Color Setます。設定したカラーを作成したら、名前を付けて再利用します。

そして、あなたはこのようにそれを使うことができます:

import UIKit 

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        UITextField.appearance().tintColor = UIColor(named: "YOUR-COLOR-NAME")  #here
    }
}

macOS 10.15 / iOS 13 / Swift 5でテスト済み


0

SwiftUIでTextfieldこれと同等のものを検索する人は、次のようになりますaccentColor

TextField("Label", text: $self.textToBind).accentColor(Color.red)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.