मैं टेक्स्ट का रंग कैसे बदल सकता हूं UISearchBar?
जवाबों:
आपको UITextFieldUISearchBar के अंदर पहुंचना होगा । आप का उपयोग करके कर सकते हैंvalueForKey("searchField")
var textFieldInsideSearchBar = yourSearchbar.valueForKey("searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
स्विफ्ट 3 अपडेट
let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
searchFieldKVC के माध्यम से एक्सेस करने की आवश्यकता नहीं होगी ।
मेरे लिए स्विफ्ट 4 में काम करना:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue: UIColor.white]
स्विफ्ट 4.2, आईओएस 12:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
यदि आपको केवल एक अंधेरे पृष्ठभूमि पर इसे पठनीय बनाने की आवश्यकता है, तो आप बारस्टाइल को बदल सकते हैं। निम्नलिखित खोज पट्टी में पाठ और बटन को सफेद बनाता है:
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
}
}
यह मेरे लिए iOS 11, Xcode 9 पर काम करता है:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue
मैं इसे लिखता हूं, AppDelegateलेकिन मुझे लगता है कि यह काम करता है यदि आप इसे कहीं और डालते हैं।
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];यह निश्चित रूप से Objective-C है, स्पष्ट अनुवाद के साथ Swift का उपयोग करते हुएappearance(whenContainedInInstancesOf:)
मुझे लगता है कि सबसे सुविधाजनक तरीका एक textColorसंपत्ति सेट करना है UISearchBar।
स्विफ्ट 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
}
}
}
}
प्रयोग
searchBar.textColor = UIColor.blue // Your color
स्विफ्ट 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
}
}
}
}
आप इसका उपयोग इस प्रकार करेंगे:
searchBar.textColor = UIColor.blueColor() // Your color
Xcode 11 और iOS 13 के बाद से पाठ क्षेत्र को सीधे एक्सेस करना संभव हो गया है:
searchBar.searchTextField
आप हमेशा इसे इस तरह से सुलभ बनाने के लिए कुछ कोड लिख सकते हैं।
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
}
}
आप इसे घातक त्रुटियों के साथ वैकल्पिक नहीं बना सकते हैं, इस कोड का परीक्षण iOS 7 से iOS 13GM तक किया जाता है। लेकिन मैं सिर्फ वैकल्पिक संस्करण के लिए जाना होगा।
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")
}
}
आप इसे सर्चबियर के अंदर यूआईटेक्स्टफिल्ड पर पहुँच कर कर सकते हैं, फिर आप इसकी पृष्ठभूमि का रंग, टेक्स्ट का रंग और अन्य सभी यूआईटैक्सफ़िल्ड गुण बदल सकते हैं
TextField तक पहुँचने के लिए निम्नलिखित एक्सटेंशन जोड़ें
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
}
}
मैंने ऊपर लिखे गए कुछ समाधानों की कोशिश की, लेकिन वे काम नहीं किए (अब, मुझे लगता है)।
अगर आप केवल iOS 13 को हैंडल करना चाहते हैं:
mySearchBar.searchTextField.textColor = .red
लेकिन अगर आप पुराने iOS को भी हैंडल करना चाहते हैं, तो यहां मैंने किया है:
एक कस्टम बनाने के लिए UISearchBarवर्ग कहा जाता है, SearchBar : UISearchBar, UISearchBarDelegate
यह SearchBarहोगा UISearchBarDelegateतरीकों मैं संभाल करना चाहते हैं और इसकेdelegate सेट।
और मैं कक्षा में जोड़ता हूं:
var textField: UITextField? {
if #available(iOS 13.0, *) {
return self.searchTextField
}
return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField
}
संक्षिप्त विवरण:
अब iOS13 के साथ, आप UITextFieldधन्यवाद का उपयोग कर सकते हैं UISearchBar.searchTextField, जो कि प्रकार का है UISearchTextField, जो विरासत में मिला हैUITextField ।
जब से मैं अपने पदानुक्रम को जानता हूं, मुझे पता है कि मेरा textFieldनहीं होगाnill पुराने संस्करणों के लिए इसलिए दोनों ही मामलों में, मुझे एक टेक्स्टफ़ील्ड मिलता है जिसे मैं आसानी से कस्टमाइज़ कर सकता हूं, जो आज हर संस्करण पर काम कर रहा है, 9 से 13 तक।
यहाँ यह काम करने के लिए आवश्यक पूर्ण कोड है:
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
}
}
}
आप SearchBarइस पर जोड़कर कुछ अनुकूलन भी सेट कर सकते हैं :
let searchBar = UISearchBar.appearance(whenContainedInInstancesOf: [SearchBar.self])
searchBar.backgroundImage = UIImage()
searchBar.isTranslucent = false
searchBar.returnKeyType = .search
फिर आप इसे एक्सआईबी / स्टोरीबोर्ड पर सेट करते हैं और आप इसे संभालते हैं जैसे कि यह एक साधारण था UISearchBar(यदि आप प्रतिनिधियों को नहीं भूले!)।
(यह समाधान केवल Xcode 10 और iOS 12 के लिए परीक्षण किया गया है) खोज बार के टेक्स्ट फ़ील्ड तक पहुंचने के लिए एक एक्सटेंशन जोड़ें:
extension UISearchBar {
var textField: UITextField? {
return subviews.first?.subviews.compactMap { $0 as? UITextField }.first
}
}
फिर अपनी खोज पट्टी में टेक्स्ट फ़ील्ड का टेक्स्ट रंग सेट करने के लिए उस संपत्ति का उपयोग करें:
let searchBar = UISearchBar()
searchBar.textField?.textColor = UIColor.white // or whichever color you want
// EDIT
उपरोक्त कोड iOS 13. के लिए काम नहीं करता है। इसे इस्तेमाल करने का एक बेहतर तरीका है:
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 }
}
}
यहाँ "UITextField खोजें" दृष्टिकोण का Xamarin.iOS C # संस्करण है। भविष्य के iOS दृश्य पदानुक्रम में UITextField के गायब होने पर यह क्रैश नहीं होगा।
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;
}
}
}
स्विफ्ट 5.2 और आईओएस 13.3.1: -
यह बढ़िया काम करता है।
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
स्विफ्ट 5:
searchBar[keyPath: \.searchTextField].textColor = UIColor(...)