A'nın metin rengini nasıl değiştirebilirim UISearchBar
?
Yanıtlar:
UITextField
UISearchBar'ın içine erişmeniz gerekir . Bunu kullanarak yapabilirsinizvalueForKey("searchField")
var textFieldInsideSearchBar = yourSearchbar.valueForKey("searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
Swift 3 güncellemesi
let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
searchField
KVC üzerinden erişmeniz gerekmezdi .
Benim için Swift 4'te çalışmak:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue: UIColor.white]
Swift 4.2, IOS 12:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
Yalnızca koyu bir arka planda okunabilir hale getirmeniz gerekiyorsa, barStyle'ı değiştirebilirsiniz. Aşağıdakiler, arama çubuğundaki metin ve düğmeleri beyaz yapar:
searchController.searchBar.barStyle = .black
public extension UISearchBar {
public func setTextColor(color: UIColor) {
let svs = subviews.flatMap { $0.subviews }
guard let tf = (svs.filter { $0 is UITextField }).first as? UITextField else { return }
tf.textColor = color
}
}
Bu benim için iOS 11, Xcode 9'da çalışıyor:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue
İçinde yazıyorum AppDelegate
ama başka bir yere de koyarsan işe yarıyor sanırım.
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];
appearance(whenContainedInInstancesOf:)
Xcode 11 ve iOS 13'ten beri metin alanına doğrudan erişim mümkün hale geldi:
searchBar.searchTextField
Her zaman bu şekilde erişilebilir olmasını sağlamak için bir kod yazabilirsiniz.
extension UISearchBar {
public var textField: UITextField? {
if #available(iOS 13.0, *) {
return searchTextField
}
guard let firstSubview = subviews.first else {
assertionFailure("Could not find text field")
return nil
}
for view in firstSubview.subviews {
if let textView = view as? UITextField {
return textView
}
}
assertionFailure("Could not find text field")
return nil
}
}
Ayrıca ölümcül hatalarla isteğe bağlı olmamasını da sağlayabilirsiniz, bu kod iOS 7'den iOS 13GM'ye kadar test edilmiştir. Ama sadece isteğe bağlı versiyona giderdim.
extension UISearchBar {
public var textField: UITextField {
if #available(iOS 13.0, *) {
return searchTextField
}
guard let firstSubview = subviews.first else {
fatalError("Could not find text field")
}
for view in firstSubview.subviews {
if let textView = view as? UITextField {
return textView
}
}
fatalError("Could not find text field")
}
}
Bence en uygun yol bir textColor
mülk ayarlamaktır UISearchBar
.
Swift 3.0
extension UISearchBar {
var textColor:UIColor? {
get {
if let textField = self.value(forKey: "searchField") as?
UITextField {
return textField.textColor
} else {
return nil
}
}
set (newValue) {
if let textField = self.value(forKey: "searchField") as?
UITextField {
textField.textColor = newValue
}
}
}
}
Kullanım
searchBar.textColor = UIColor.blue // Your color
Swift 2.3
extension UISearchBar {
var textColor:UIColor? {
get {
if let textField = self.valueForKey("searchField") as? UITextField {
return textField.textColor
} else {
return nil
}
}
set (newValue) {
if let textField = self.valueForKey("searchField") as? UITextField {
textField.textColor = newValue
}
}
}
}
Bunu şu şekilde kullanırsınız:
searchBar.textColor = UIColor.blueColor() // Your color
Bunu dene,
searchBar.searchTextField.textColor = .white
Bunu iOS 11'i hedefleyen uygulama ile kullanıyorum.
[Güncelleme] Gözlemledim, uygulama eski sürümlerde (<iOS 13) çöküyor, ancak derleyici sürüm kontrolünden hiç şikayet etmedi, lütfen birisi bunun neden olduğunu açıklasın.
Bunu searchBar içindeki UITextField'e erişerek yapabilirsiniz, ardından arka plan rengini, metin rengini ve diğer tüm UITextField özelliklerini değiştirebilirsiniz.
textField'a erişmek için aşağıdaki uzantıyı ekleyin
extension UISearchBar {
/// Return text field inside a search bar
var textField: UITextField? {
let subViews = subviews.flatMap { $0.subviews }
guard let textField = (subViews.filter { $0 is UITextField }).first as? UITextField else { return nil
}
return textField
}
}
Yukarıda yazılı çözümlerden birkaçını denedim ama işe yaramadı (artık sanırım).
Yalnızca iOS 13'ü kullanmak istiyorsanız:
mySearchBar.searchTextField.textColor = .red
Ancak daha eski iOS'la da başa çıkmak istiyorsanız, işte yaptığım yol:
Bu , işlemek istediğim yöntemlere ve setine sahip olacak UISearchBar
adlı özel bir sınıf oluşturun .SearchBar : UISearchBar, UISearchBarDelegate
SearchBar
UISearchBarDelegate
delegate
Ve sınıfa ekliyorum:
var textField: UITextField? {
if #available(iOS 13.0, *) {
return self.searchTextField
}
return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField
}
Kısa açıklama:
Artık iOS13 ile , miras kalan türünden olan UITextField
teşekkürler'e erişebilirsiniz .UISearchBar.searchTextField
UISearchTextField
UITextField
Hiyerarşimi bildiğim için, eski sürümlerimin eski sürümler için textField
olmayacağını biliyorum, nill
bu yüzden her iki durumda da, bugün 9'dan 13'e kadar her sürümde çalışarak kolayca özelleştirebileceğim bir metin alanı alıyorum.
İşte çalışması için gereken kodun tamamı:
class SearchBar: UISearchBar, UISearchBarDelegate {
var textField: UITextField? {
if #available(iOS 13.0, *) {
return self.searchTextField
}
return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField
}
override func awakeFromNib() {
super.awakeFromNib()
delegate = self
if let textField = textField {
textField.textColor = .red
textField.clearButtonMode = .whileEditing
textField.returnKeyType = .search
}
}
}
Aşağıdakilere SearchBar
ekleyerek de bazı özelleştirmeleri ayarlayabilirsiniz :
let searchBar = UISearchBar.appearance(whenContainedInInstancesOf: [SearchBar.self])
searchBar.backgroundImage = UIImage()
searchBar.isTranslucent = false
searchBar.returnKeyType = .search
Sonra onu XIB / Storyboard'a ayarlıyorsunuz ve basitmiş gibi hallediyorsunuz UISearchBar
(delegeleri unutmadıysanız!).
(Bu çözüm yalnızca Xcode 10 ve iOS 12 için test edilmiştir.) Arama çubuğunun metin alanına erişmek için bir uzantı ekleyin:
extension UISearchBar {
var textField: UITextField? {
return subviews.first?.subviews.compactMap { $0 as? UITextField }.first
}
}
Ardından, arama çubuğunuzdaki metin alanının metin rengini ayarlamak için bu özelliği kullanın:
let searchBar = UISearchBar()
searchBar.textField?.textColor = UIColor.white // or whichever color you want
// DÜZENLE
Yukarıdaki kod iOS 13 için çalışmaz. Bunu halletmenin daha iyi bir yolu şunu kullanmaktır:
extension UISearchBar {
var textField: UITextField? {
return self.subviews(ofType: UITextField.self).first
}
}
extension UIView {
var recursiveSubviews: [UIView] {
return self.subviews + self.subviews.flatMap { $0.recursiveSubviews }
}
func subviews<T: UIView>(ofType: T.Type) -> [T] {
return self.recursiveSubviews.compactMap { $0 as? T }
}
}
Swift 5.2 ve iOS 13.3.1: -
İyi çalışıyor.
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
Burada "UITextField bul" yaklaşımının Xamarin.iOS C # sürümü verilmiştir. UITextField, gelecekteki iOS görünüm hiyerarşisinde kaybolursa çökmez.
var tf = searchBar.AllSubViews().FirstOrDefault(v => v is UITextField);
if (tf != null)
(tf as UITextField).TextColor = UIColor.White;
public static IEnumerable<UIView> AllSubViews(this UIView view)
{
foreach (var v in view.Subviews)
{
yield return v;
foreach (var sv in v.AllSubViews())
{
yield return sv;
}
}
}
Swift 5:
searchBar[keyPath: \.searchTextField].textColor = UIColor(...)
Bu benim için çalıştı.
if #available(iOS 13.0, *) {
searchBar.searchTextField.textColor = .white
}