UITextField ve UITextView İmleç / Caret Rengini Değiştirme


222

İOS'ta imlecin / işaretin rengini değiştirmeyi merak ediyorum UITextField(Ve UITextViewaynı cevap ise). OSX geliştirme için cevaplar gördüm, ancak iOS için hiçbir şey yok.

Bu mümkün mü?


1
UITextFieldArayüz Oluşturucu'da bunun nasıl yapılacağı da dahil olmak üzere ayrıntılı yanıt için stackoverflow.com/a/18759577/1709587
Mark Amery

1
Stackoverflow.com/a/18945907/1292230 ;) adresinden basit ve eksiksiz yanıt ;)
RileyE

Yanıtlar:


513

İOS 7+'yı hedefliyorsanız, bu çok daha kolay hale getirildi. Sadece tintColorgörünüm proxy'sini kullanarak bir imleç ile alanı değiştirin ve uygulama boyunca geçerli olacaktır:

Swift 3.0:

UITextField.appearance().tintColor = .black 

Objective-C:

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

Bir kişi için aynı cevap geçerlidir UITextField:

Swift 3.0:

myTextField.tintColor = .black 

Objective-C

[myTextField setTintColor:[UIColor blackColor]];

13
Bu, renk tonunu tamamen farklı bir şeye ayarlasam bile UIBarButton öğesinin renk tonlarımın varsayılan değerlerine sabitlenmesine neden olduğunu buldum. Oluşturulduklarında UITextFields renk tonunu ayrı ayrı ayarlayarak sorunu çözdüm.
willtalmadge

Bu işe yarar, ancak bunu didFinishLaunching'de yaparsanız? Veya kullanıcı etkileşimine göre yapabilir misiniz, örneğin bir düğmeye basın?
Steffen Andersen

@SteffenAndersen, UIAppearance proxy API belgelerine göre davranmalıdır.
DiscDev

[[UITextView görünümü] setTintColor: teal]; bazı nedenlerden dolayı bu navbar düğmelerimin rengini değiştiriyor, nasıl bağımsız olarak ayarladınız?
John

3
Swift 3.0'da şunu kullanın: UITextField.appearance (). TintColor = UIColor.black
Lucas Torquato

44

İOS7 ile textField öğesinin renk tonunu kolayca değiştirebilirsiniz


20

Hızlı 3:

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

1
Swift 3.0'da şunu kullanın: UITextField.appearance (). TintColor = UIColor.black
Lucas Torquato

13

Not: Bu yanıt güncel değil ve yalnızca iOS 7 öncesi geliştirme için kullanılmalıdır. İOS 7'de görünüm proxy'sini kullanarak 1 satırlık bir çözüm için diğer yanıtlara bakın.

Üzerinde çalıştığım bir projede aynı problemle karşılaştıktan sonra bu soruya vardım.

Mevcut Özel API'ları kullanmadığı için AppStore inceleme ekibi tarafından kabul edilecek bir çözüm oluşturmayı başardım.

UITextField genişleten DGTextField adlı bir denetim oluşturduk.


Bu harika. Dürüst olmak gerekirse, bu nedenle, dokümanlardaki "Uygun" ifadesine kesinlikle daha yakından bakacağım. Ancak, sadece bir kişinin bunu okumak ve tamir etmek için zaman harcaması gerektiğine sevindim. Umarım diğer insanlar bunu görebilir ve kullanabilir!
RileyE

Ancak, animasyon seçeneklerini önerebilir, @propery'yi kaldırabilir ve yalnızca ayarlayıcılar ve alıcılar ile özel düzeltme genişliği için ayarlayıcı ve alıcı oluşturabilirim. İlginizi çekmeyebilir, ama her zaman küçük tweaks'i seviyorum!
RileyE

@RileyE Çözümümden yararlanabildiğiniz için mutluyum. Repoyu çatallamaktan ve paylaşmak istediğiniz ince ayarları eklemekten çekinmeyin.
Dov

3
İOS

12
yourTextField.tintColor = [UIColor whiteColor];

Kodda ayarlarsanız çalışır, çünkü çünkü renk tetikleyici bir şekilde Arayüz Oluşturucu'da (Xcode 6.1.1) yapmaz . Herhangi bir görünüm proxy'sini değiştirmeye gerek kalmadan uygundur.


2
Bilinmeyen bir nedenden dolayı beyaz renkte benim için çalışmıyor, ancak diğer tüm renklerle çalışıyor (iOS 8'de test). Çalışması için neredeyse beyaz ancak beyaz olmayan bir renk ayarlamam gerekiyordu.
Leszek Szary

@LeszekSzary Hey! Günümü kurtardın! Yaklaşık 4 saat deniyordum ve sözlerin ipucu! Apple, geliştiriciyi deli eden bu çılgın hatayı düzeltmelidir.
Karthick Ramesh

10

Ayar tintColoriçin UITextFieldve UITextViewfarklı çalışır. Iken, imleç rengini değiştirmek için UITextFieldgüncelledikten sonra ek kod çağırmanız gerekmez tintColor, ancak UITextViewsizin için gerekir.

Yani ayarladıktan sonra tintColoriçin UITextView(o kod IB içi veya önemli değil) aramak gerekir textView.tintColorDidChange()bunu uygulamak için (aslında onun subviews hiyerarşiye aşağı metin görünümün yapılandırma geçecek).


5

Bu benim için hızlı çalıştı:

UITextField.tintColor = UIColor.blackColor()

Bunu film şeridinde de ayarlayabilirsiniz: https://stackoverflow.com/a/18759577/3075340


Bu işe yaramıyor. Hatayı aldım:Instance member 'tintcolor' cannot be used on type 'UITextField'
pableiros

@pableiros Yukarıda Swift 2 ile birlikteydi. Belki şimdi Swift 3 kullanıyorsunuz?
Micro

Swift 3 ve Swift 2.3 üzerinde denedim, Swift 2.2 ve daha
düşükte

3

Daha genel bir yaklaşım, UIView'in görünümünün renk tonunu ayarlamak olacaktır.

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

Birçok varsayılan kullanıcı arayüzü öğesi kullanıyorsanız mantıklıdır.


2
Hmmm ... bunun başka birçok yan etkisi var ... soru sadece şapka rengini değiştirmekle ilgili soruyor ve cevabınız uygulamadaki her bir UIView'i renklendirecek ... bu muhtemelen çoğu insanın istediği yaklaşım değil almak.
DiscDev

Bunun üzerinde +1, çok fazla yan etki, hedef sadece şapka rengini değiştirmekse. UIView tintColor'u ayarlama Bir kabı şekillendirirken kullanışlıdır (ancak daha sonra kullanmam[UIView appearance]
colinta

2

Deneyin, benim için çalışıyor.

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

6
Bu özel bir yöntem kullanıyor, ancak öneri için teşekkür ederim. Bu, bir uygulamayı kolayca reddedebilir.
RileyE


0

Durgesh'in yaklaşımı işe yarıyor.

Ayrıca bu tür KVC çözümlerini birçok kez kullandım. Rağmen belgelenmemiş gibi görünüyor, ama işe yarıyor. Açıkçası, burada herhangi bir özel yöntem kullanmıyorsunuz - yalnızca yasal olan Anahtar / Değer Kodlaması.

PS Dün yeni uygulamam AppStore'da bu yaklaşımla ilgili herhangi bir sorun yaşamadı. Ve bazı salt okunur özellikleri (navigatonBar gibi) veya özel ivarları değiştirirken KVC'yi kullandığımda ilk durum bu değil.


1
Özel bir yöntem kullanmıyor, bunun yerine anahtarların belgelenmemiş olması, App Store'daki uygulamalar için kullanılmadığı anlamına geliyor. Başvurunuz öznel olarak reddedilebilir. Birçoğu bu yöntemi kullanmaktan dolayı reddedildiği için, nazik bir gözden geçireniniz olmalıdır.
RileyE

Sonra yaklaşık 10 tür yorumcular :) ve çok sayıda meslektaşlarım var.
malex

1
Açıklığa kavuşturmak gerekirse, bu durumda "Anahtar-Değer Kodlaması" kolaylık yöntemini kullanarak bir özelliğe bir değer atamaktadır. Bunu bir ayarlayıcıya karşı kullanmamızın nedeni, mülke erişilemez / gizli / özel olmasıdır.
RileyE

1
Burada (belki de önemli bir şey bilmiyorum) sadece KVC ile ilgili belgelerin kelimenin tam anlamıyla herhangi bir kısıtlama getirmediğini kastediyorum. Tüm bunları başarıyla kullanıyorum. Ve umarım diğerleri yapabilir.
malex

1
Takdir. Bununla birlikte, Apple, 'Kullanım Koşulları Sözleşmesi'nde' belgelerinde yer alan herhangi bir şeyi kullanmamıza ve açıkça tartışmamıza izin verdiğini belirtmektedir ve belgelenmemiş yöntemlerin kullanılmasını yasaklamaktadır ('textInputTraits' ayarlayıcı yöntemine KVC aracılığıyla erişim sağlanacaktır. özellik belgesizdir). Esas olarak, yöntemi belgelerde bulamazsanız, yasaklanmıştır. Yasak, reddi garanti etmez. Bazı uygulamaları mağazamda yapan bazı nedenlerden dolayı reddedildim. Belgelenmemiş yöntemlerle vuruldu ve özlendi.
RileyE

0

Swift ile Arayüz Oluşturucu sürümü için

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

0

Eğer ise UITextField, UISearchBarönce textFieldgelen searchBarve sonra tintColorözelliği uygulayın :

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

0

Hızlı 4

ViewDidLoad () içinde aşağıdaki kodu çağırmanız yeterlidir:

KOD ÖRNEĞİ

//txtVComplaint is a textView

txtVComplaint.tintColor = UIColor.white

txtVComplaint.tintColorDidChange()

0

Bazı özel renkler istiyorsanız, Assets.xcassetsklasöre gidebilir , sağ tıklayıp seçebilir New Color Set, ayarladığınız rengi oluşturduktan sonra, yeniden kullanmak için bir ad verin.

Ve bunu şöyle kullanabilirsiniz:

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 üzerinde test edildi


0

İçin SwiftUI içinde eşdeğer arama yapanlar için Textfieldşudur accentColor:

TextField("Label", text: $self.textToBind).accentColor(Color.red)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.