我为UISearchBar做了一个扩展和类别,用于自定义搜索栏中的文本字段。
兼容iOS 9到iOS 13。
Swift 4+
import UIKit
extension UISearchBar {
var compatibleSearchTextField: UITextField {
guard #available(iOS 13.0, *) else { return legacySearchField }
return self.searchTextField
}
private var legacySearchField: UITextField {
if let textField = self.subviews.first?.subviews.last as? UITextField {
return textField
} else if let textField = self.value(forKey: "searchField") as? UITextField {
return textField
} else {
return UITextField()
}
}
}
使用示例:
var searchController: UISearchController?
searchController?.searchBar.compatibleSearchTextField.textColor = UIColor.XXX
searchController?.searchBar.compatibleSearchTextField.backgroundColor = UIColor.XXX
Objective-C
UISearchBar+SearchTextField.h
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UISearchBar (SearchTextField)
@property (nonatomic, readonly) UITextField *compatibleSearchTextField;
@end
NS_ASSUME_NONNULL_END
UISearchBar+SearchTextField.m
#import "UISearchBar+SearchTextField.h"
@implementation UISearchBar (SearchTextField)
- (UITextField *)compatibleSearchTextField {
if (@available(iOS 13.0, *)) {
#ifdef __IPHONE_13_0
return self.searchTextField;
#else
return (UITextField *)[self valueForKey:@"searchField"];
#endif
} else {
return [[[self.subviews firstObject] subviews] lastObject];
}
}
@end
使用示例:
- (UISearchBar *)searchBar {
if (!_searchBar) {
_searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(X, X, X, X)];
_searchBar.compatibleSearchTextField.textColor = [UIColor XXX];
_searchBar.compatibleSearchTextField.backgroundColor = [UIColor XXX];
}
return _searchBar
}
barTintColor
属性。请确保在代码或故事板中将isTranslucent
设置为false
。 - heyfrank