1. ホーム
  2. swift

SwiftUIです。TextFieldのプレースホルダの色を変えるには?

2023-07-19 05:06:57

質問

TextFieldのプレースホルダーの色を変更したいのですが、そのためのメソッドが見当たりません。

を設定しようとしたのですが foregroundColoraccentColor というようにしても、プレースホルダーの色は変わりません。

以下はそのコードです。

TextField("Placeholder", $text)
    .foregroundColor(Color.red)
    .accentColor(Color.green)

もしかして、まだAPIがない?

どのように解決するのですか?

apiは(まだ)ありません。 しかし、あなたはできる :

カスタム placeholder モディファイアを使って 任意のビュー の保持者として その他のビュー !例えば

TextField("", text: $text)
    .placeholder(when: text.isEmpty) {
        Text("Placeholder recreated").foregroundColor(.gray)
}

<イグ

???? これは単純な ZStack の中でできることです。 View のような拡張子を使用します。

extension View {
    func placeholder<Content: View>(
        when shouldShow: Bool,
        alignment: Alignment = .leading,
        @ViewBuilder placeholder: () -> Content) -> some View {

        ZStack(alignment: alignment) {
            placeholder().opacity(shouldShow ? 1 : 0)
            self
        }
    }
}

???? これで 任意の を適用できるようになりました。

✅興味があれば、こちらもどうぞ。 サイズ変更可能なグラデーションを任意のビューに適用する方法


???? シンプルにする技術

ほとんどの場合、文字列と灰色のプレースホルダーを渡すだけでよいのです。

TextField("", text: $text)
    .placeholder("Placeholder", when: text.isEmpty)

を使えば、上記の拡張子の周りに簡単なラッパーを書くことができます。

extension View {
    func placeholder(
        _ text: String,
        when shouldShow: Bool,
        alignment: Alignment = .leading) -> some View {
            
        placeholder(when: shouldShow, alignment: alignment) { Text(text).foregroundColor(.gray) }
    }
}

こんな感じ?