Ubah UITextField dan UITextView Kursor / Warna Karet

222

Saya bertanya-tanya tentang mengubah warna kursor / tanda sisipan di UITextField(Dan UITextViewjika jawabannya sama) di iOS. Saya telah melihat jawaban untuk pengembangan OSX, tetapi tidak ada untuk iOS.

Apakah ini mungkin?

RileyE
sumber
1
Jawaban terperinci untuk UITextField, termasuk bagaimana melakukan ini di Interface Builder, di stackoverflow.com/a/18759577/1709587
Mark Amery
1
Jawaban sederhana dan lengkap di stackoverflow.com/a/18945907/1292230 ;)
RileyE

Jawaban:

513

Jika Anda menargetkan iOS 7+, ini menjadi lebih mudah. Cukup ganti tintColorbidang dengan kursor menggunakan proxy penampilan dan itu akan berlaku di seluruh aplikasi:

Swift 3.0:

UITextField.appearance().tintColor = .black 

Tujuan-C:

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

Jawaban yang sama berlaku untuk seorang individu UITextField:

Swift 3.0:

myTextField.tintColor = .black 

Objektif-C

[myTextField setTintColor:[UIColor blackColor]];
DiscDev
sumber
13
Saya menemukan ini menyebabkan warna warna item UIBarButton saya menjadi tetap pada nilai standarnya bahkan jika saya mengatur warna tint ke sesuatu yang sama sekali berbeda. Saya memecahkan masalah dengan mengatur warna warna UITextFields secara terpisah ketika mereka dibuat.
willtalmadge
Ini berfungsi, tetapi hanya jika Anda melakukannya di didFinishLaunching? Atau dapatkah Anda melakukannya berdasarkan interaksi pengguna, mis. Tekan tombol?
Steffen Andersen
@SteffenAndersen harus berperilaku sesuai dengan dokumentasi API proksi UIApearance.
DiscDev
[[Tampilan UITextView] setTintColor: teal]; untuk beberapa alasan ini mengubah warna navbarbuttons saya, bagaimana Anda mengatur secara terpisah?
John
3
Pada Swift 3.0 gunakan ini: UITextField.appearance (). TintColor = UIColor.black
Lucas Torquato
44

Dengan iOS7 Anda cukup mengubah tintColor dari textField

Topi
sumber
20

Swift 3:

  UITextField.appearance().tintColor = UIColor.black
  UITextView.appearance().tintColor = UIColor.black
Peter Kreinz
sumber
1
Pada Swift 3.0 gunakan ini: UITextField.appearance (). TintColor = UIColor.black
Lucas Torquato
13

Catatan: Jawaban ini kedaluwarsa dan harus digunakan hanya untuk pengembangan pra-iOS 7. Lihat jawaban lain untuk solusi 1 baris menggunakan proksi penampilan di iOS 7.

Saya sampai pada pertanyaan ini setelah saya menghadapi masalah yang sama dalam proyek yang sedang saya kerjakan.

Saya berhasil membuat solusi yang akan diterima oleh tim peninjau AppStore karena tidak menggunakan API Pribadi apa pun yang ada.

Saya telah membuat kontrol yang disebut DGTextField yang memperluas UITextField.

Dov
sumber
Ini bagus. Sejujurnya, karena ini, saya pasti akan terus mengawasi "Sesuai dengan" dalam dokumen. Namun, saya senang hanya satu orang yang menghabiskan waktu membaca dan mengutak-atik ini. Semoga orang lain dapat melihat dan menggunakan ini!
RileyE
Namun, saya mungkin merekomendasikan opsi animasi, menghapus @propery dan hanya membuat setter dan getter serta setter dan pengambil untuk lebar tanda sisipan kustom. Anda mungkin tidak tertarik, tetapi saya selalu menyukai tweak kecil!
RileyE
@RileyE Saya senang Anda bisa mendapatkan manfaat dari solusi saya. Jangan ragu untuk garpu repo dan tambahkan tweak yang ingin Anda bagikan.
Dov
3
Jauh lebih mudah di iOS 7 - lihat jawaban saya di bawah ini: stackoverflow.com/a/18945907/1103584
DiscDev
12
yourTextField.tintColor = [UIColor whiteColor];

Ini berfungsi jika Anda mengaturnya dalam kode, karena entah bagaimana pemicu warna tidak melakukannya di Interface Builder (Xcode 6.1.1). Ini cocok dengan baik tanpa perlu mengubah proxy penampilan.

David
sumber
2
Untuk beberapa alasan yang tidak diketahui, itu tidak bekerja untuk saya dengan whiteColor tetapi bekerja dengan setiap warna lain (pengujian pada iOS 8). Saya harus mengatur warna yang hampir putih tetapi tidak putih untuk membuatnya berfungsi.
Leszek Szary
@LeszekSzary Hai! Kamu menyelamatkan hariku! Saya mencoba hampir 4 jam dan kata-kata Anda adalah petunjuk! Apple harus memperbaiki bug gila ini yang memang membuat pengembang gila.
Karthick Ramesh
10

Pengaturan tintColoruntuk UITextFielddan UITextViewbekerja secara berbeda. Sedangkan untuk UITextFieldAnda tidak perlu memanggil kode tambahan setelah memperbarui tintColoruntuk mengubah warna kursor, tetapi untuk UITextViewAnda perlu.

Jadi setelah pengaturan tintColoruntuk UITextView(tidak masalah dalam IB atau dalam kode) Anda perlu menelepon textView.tintColorDidChange()untuk menerapkannya (sebenarnya itu akan meneruskan konfigurasi tampilan teks ke hierarki tampilan bawahnya).

ilya
sumber
5

Ini berhasil bagi saya dengan cepat:

UITextField.tintColor = UIColor.blackColor()

Anda juga dapat mengatur ini di storyboard: https://stackoverflow.com/a/18759577/3075340

Mikro
sumber
Ini tidak berfungsi. Saya mendapat kesalahan:Instance member 'tintcolor' cannot be used on type 'UITextField'
pableiros
@pableiros Di atas adalah dengan Swift 2. Mungkin Anda menggunakan Swift 3 sekarang?
Mikro
Saya mencoba pada Swift 3 dan Swift 2.3, saya tidak yakin apakah pada Swift 2.2 dan lebih rendah
pableiros
3

Pendekatan yang lebih umum adalah dengan mengatur tintColor penampilan UIView.

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

Masuk akal jika Anda menggunakan banyak elemen UI default.

arnekolja
sumber
2
Hmmm ... ini memiliki banyak efek samping lain ... pertanyaannya hanya bertanya tentang mengubah warna tanda sisipan, dan jawaban Anda akan mewarnai setiap UIView di aplikasi ... ini mungkin bukan pendekatan yang diinginkan kebanyakan orang untuk mengambil.
DiscDev
Memberi +1 pada itu, terlalu banyak efek samping, jika tujuannya hanya untuk mengubah warna caret. Mengatur UIView tintColor berguna ketika Anda mendesain sebuah wadah (tapi kemudian saya tidak akan menggunakan[UIView appearance]
colinta
2

Coba, ini bekerja untukku.

[[self.textField valueForKey:@"textInputTraits"] setValue:[UIColor redColor] strong textforKey:@"insertionPointColor"];
Durgesh
sumber
6
Itu menggunakan metode pribadi, tetapi terima kasih atas sarannya. Ini dapat dengan mudah membuat aplikasi ditolak.
RileyE
1

Hanya dimungkinkan dengan mengakses properti pribadi dan karenanya dapat menyebabkan penolakan aplikasi Apple AppStore.

lihat pertanyaan Stackoverflow ini

Max Ballo
sumber
0

Pendekatan Durgesh berhasil.

Saya juga menggunakan solusi KVC seperti itu berkali-kali. Meskipun tampaknya tidak berdokumen, tetapi berhasil. Terus terang, Anda tidak menggunakan metode pribadi apa pun di sini - hanya Kode-Nilai Kunci yang sah.

PS Kemarin aplikasi baru saya muncul di AppStore tanpa masalah dengan pendekatan ini. Dan ini bukan kasus pertama ketika saya menggunakan KVC dalam mengubah beberapa properti read-only (seperti navigatonBar) atau ivars pribadi.

malex
sumber
1
Itu tidak menggunakan metode pribadi, melainkan bahwa kunci tidak berdokumen, yang berarti mereka tidak dapat digunakan untuk aplikasi di App Store. Aplikasi Anda mungkin ditolak secara subyektif. Anda harus memiliki resensi yang baik, karena banyak yang ditolak karena menggunakan metode itu.
RileyE
Lalu aku punya sekitar 10 jenis peninjau :) dan banyak kolega saya juga.
Malex
1
Hanya untuk memperjelas, "Pengodean Nilai-Kunci" dalam kasus ini adalah menetapkan nilai ke properti menggunakan metode kenyamanan. Alasan kami menggunakannya, versus setter, adalah karena properti tidak dapat diakses / disembunyikan / pribadi.
RileyE
1
Maksud saya (mungkin saya tidak tahu sesuatu yang penting) hanya bahwa dokumentasi pada KVC tidak menyiratkan batasan apa pun secara harfiah. Jadi saya berhasil menggunakan semua ini. Dan semoga bisa orang lain.
Malex
1
Dihargai Namun, Apple, dalam 'Ketentuan Penggunaan' menyatakan bahwa kami diizinkan untuk menggunakan dan mendiskusikan secara terbuka apa pun yang termasuk dalam dokumentasi mereka dan melarang penggunaan metode tidak berdokumen (Mengakses metode setter 'textInputTraits' melalui KVC akan dimasukkan, karena properti tidak berdokumen). Pada dasarnya, jika Anda tidak dapat menemukan metode dalam dokumentasi, itu dilarang. Dilarang tidak menjamin penolakan. Saya sudah mendapatkan beberapa aplikasi ditolak karena alasan yang termasuk dalam beberapa aplikasi saya yang membuatnya ke toko. Itu terkena dan rindu dengan metode tidak berdokumen.
RileyE
0

Untuk versi Interface Builder dengan Swift

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

Jika UITextFielddari UISearchBarmaka pertama dapatkan textFielddari searchBardan kemudian terapkan tintColorproperti:

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

sumber
0

Cepat 4

Di viewDidLoad () panggil saja kode di bawah ini:

SAMPEL KODE

//txtVComplaint is a textView

txtVComplaint.tintColor = UIColor.white

txtVComplaint.tintColorDidChange()
Shamshad
sumber
0

Saya pikir. Jika Anda menginginkan beberapa warna kustom, Anda dapat pergi ke Assets.xcassetsfolder, klik kanan dan pilih New Color Set, setelah Anda membuat warna yang Anda atur, berikan nama untuk menggunakannya kembali.

Dan Anda dapat menggunakannya seperti ini:

import UIKit 

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

Diuji pada macOS 10.15 / iOS 13 / Swift 5

karat
sumber
0

Untuk orang yang mencari yang setara di SwiftUI untuk Textfieldini adalah accentColor:

TextField("Label", text: $self.textToBind).accentColor(Color.red)
Beninho85
sumber