Làm cách nào để thay đổi màu văn bản của a UISearchBar
?
Câu trả lời:
Bạn phải truy cập vào UITextField
bên trong UISearchBar. Bạn có thể làm điều đó bằng cách sử dụngvalueForKey("searchField")
var textFieldInsideSearchBar = yourSearchbar.valueForKey("searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
Bản cập nhật Swift 3
let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
searchField
qua KVC.
Làm việc trong Swift 4 cho tôi:
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]
Nếu bạn chỉ cần làm cho nó có thể đọc được trên nền tối, bạn có thể thay đổi barStyle. Điều sau đây làm cho văn bản và các nút trong thanh tìm kiếm có màu trắng:
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
}
}
Điều này phù hợp với tôi trên iOS 11, Xcode 9:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue
Tôi viết nó trong AppDelegate
nhưng tôi đoán nó hoạt động nếu bạn đặt nó ở một nơi khác.
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];
Đây là khóa học Objective-C, với dịch hiển nhiên đối với Swift sử dụngappearance(whenContainedInInstancesOf:)
Cách thuận tiện nhất mà tôi nghĩ là đặt một textColor
tài sản vào 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
}
}
}
}
Sử dụng
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
}
}
}
}
Bạn sẽ sử dụng nó như:
searchBar.textColor = UIColor.blueColor() // Your color
Kể từ Xcode 11 và iOS 13, có thể truy cập trực tiếp vào trường văn bản:
searchBar.searchTextField
Bạn có thể viết một số mã để luôn làm cho nó có thể truy cập được như thế này.
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
}
}
Bạn cũng có thể làm cho nó không phải là tùy chọn với các lỗi nghiêm trọng, mã này được kiểm tra từ iOS 7 cho đến iOS 13GM. Nhưng tôi sẽ chỉ sử dụng phiên bản tùy chọn.
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")
}
}
Thử đi,
searchBar.searchTextField.textColor = .white
Tôi đang sử dụng điều này với ứng dụng được nhắm mục tiêu từ iOS 11 trở đi.
[Cập nhật] Tôi đã quan sát thấy, ứng dụng bị treo trên các phiên bản cũ hơn (<iOS 13), nhưng trình biên dịch chưa bao giờ phàn nàn về việc kiểm tra phiên bản, ai đó vui lòng giải thích tại sao điều này xảy ra.
Bạn có thể làm điều này bằng cách truy cập UITextField bên trong SearchBar, sau đó bạn có thể thay đổi màu nền, màu văn bản và tất cả các thuộc tính khác của UITextField
thêm phần mở rộng sau để truy cập 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
}
}
Tôi đã thử một số giải pháp được viết ở trên nhưng chúng không hoạt động (tôi đoán vậy nữa).
Nếu bạn chỉ muốn xử lý iOS 13:
mySearchBar.searchTextField.textColor = .red
Nhưng nếu bạn cũng muốn xử lý iOS cũ hơn, đây là cách tôi đã làm:
Tạo một UISearchBar
lớp tùy chỉnh , được gọi là SearchBar : UISearchBar, UISearchBarDelegate
Lớp này SearchBar
sẽ có các UISearchBarDelegate
phương thức tôi muốn xử lý và delegate
tập hợp của nó .
Và tôi thêm vào lớp:
var textField: UITextField? {
if #available(iOS 13.0, *) {
return self.searchTextField
}
return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField
}
Giải thích ngắn gọn:
Với iOS13 bây giờ, bạn có thể truy cập UITextField
cảm ơn UISearchBar.searchTextField
, thuộc loại UISearchTextField
kế thừa từ UITextField
.
Vì tôi biết hệ thống phân cấp của mình, tôi biết tôi textField
sẽ không nill
dành cho các phiên bản cũ hơn nên trong cả hai trường hợp, tôi nhận được một trường văn bản mà tôi có thể dễ dàng tùy chỉnh, làm việc trên mọi phiên bản, từ 9 đến 13 hiện nay.
Đây là mã đầy đủ cần thiết để làm cho nó hoạt động:
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
}
}
}
Bạn cũng có thể thiết lập một số tùy chỉnh SearchBar
bằng cách thêm điều này vào:
let searchBar = UISearchBar.appearance(whenContainedInInstancesOf: [SearchBar.self])
searchBar.backgroundImage = UIImage()
searchBar.isTranslucent = false
searchBar.returnKeyType = .search
Sau đó, bạn đặt nó thành XIB / Storyboard và bạn xử lý nó như thể nó đơn giản UISearchBar
(nếu bạn không quên các đại diện!).
(Giải pháp này chỉ được thử nghiệm cho Xcode 10 và iOS 12.) Thêm một tiện ích mở rộng để truy cập vào trường văn bản của thanh tìm kiếm:
extension UISearchBar {
var textField: UITextField? {
return subviews.first?.subviews.compactMap { $0 as? UITextField }.first
}
}
Sau đó, sử dụng thuộc tính đó để đặt màu văn bản của trường văn bản trong thanh tìm kiếm của bạn:
let searchBar = UISearchBar()
searchBar.textField?.textColor = UIColor.white // or whichever color you want
// BIÊN TẬP
Đoạn mã trên không hoạt động với iOS 13. Một cách tốt hơn để xử lý vấn đề này là sử dụng:
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 }
}
}
Đây là phiên bản Xamarin.iOS C # của phương pháp "tìm UITextField". Nó sẽ không bị lỗi nếu UITextField biến mất trong hệ thống phân cấp chế độ xem iOS trong tương lai.
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.2 & iOS 13.3.1: -
Nó hoạt động tốt.
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
Swift 5:
searchBar[keyPath: \.searchTextField].textColor = UIColor(...)