web-dev-qa-db-ja.com

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

IOSのUITextField(および同じ答えの場合はUITextView)でカーソル/キャレットの色を変更することについて疑問に思っています。 OSX開発の回答を見ましたが、iOSの回答はありません。

これも可能ですか?

204
RileyE

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

Swift 3.0:

UITextField.appearance().tintColor = .black 

Objective-C:

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

同じ答えが個々のUITextViewに適用されます。

Swift 3.0:

myTextField.tintColor = .black 

Objective-C

[myTextField setTintColor:[UIColor blackColor]];
475
DiscDev

IOS7では、textFieldのtintColorを簡単に変更できます

43
Cap

Swift 3:

  UITextField.appearance().tintColor = UIColor.black
  UITextView.appearance().tintColor = UIColor.black
18
Peter Kreinz

注:この回答は古くなっており、iOS 7以前の開発にのみ使用する必要があります。iOS7の外観プロキシを使用した1行ソリューションの他の回答を参照してください

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

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

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

13
Dov
yourTextField.tintColor = [UIColor whiteColor];

コードでそれを設定すると動作します、 'cosなんとかインターフェイスビルダーではカラートリガーは行いません(Xcode 6.1.1)。外観プロキシを変更する必要なく、適切に適合しました。

11
David

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

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

6
ilya

これはSwiftで私のために働いた:

UITextField.tintColor = UIColor.blackColor()

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

4
Micro

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

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

多くのデフォルトUI要素を使用している場合に意味があります。

3
arnekolja

試してみてください、私のために働いています。

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

プライベートプロパティにアクセスすることによってのみ可能です。したがって、Apple AppStoreアプリが拒否される可能性があります。

このStackoverflowの質問を見てください

1
Max Ballo

スイフト4

ViewDidLoad()では、次のコードを呼び出すだけです。

コードサンプル

//txtVComplaint is a textView

txtVComplaint.tintColor = UIColor.white

txtVComplaint.tintColorDidChange()
0

Durgeshのアプローチは機能します。

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

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

0
malex

カスタムカラーが必要な場合は、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
rust

Swiftを使用したInterface Builderバージョンの場合

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

UITextFieldUISearchBarからのものである場合、最初にtextFieldからsearchBarを取得してから、tintColorプロパティを適用します。

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