의 텍스트 색상을 어떻게 변경할 수 UISearchBar
있습니까?
답변:
UITextField
UISearchBar 내부 에 액세스해야합니다 . 다음을 사용하여 수행 할 수 있습니다.valueForKey("searchField")
var textFieldInsideSearchBar = yourSearchbar.valueForKey("searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
Swift 3 업데이트
let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
searchField
KVC를 통해 액세스 할 필요가 없습니다 .
나를 위해 Swift 4에서 작업 :
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]
어두운 배경에서만 읽을 수 있도록해야하는 경우 barStyle을 변경할 수 있습니다. 다음은 검색 창의 텍스트와 버튼을 흰색으로 만듭니다.
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")
}
}
이 시도,
searchBar.searchTextField.textColor = .white
iOS 11 이상을 대상으로하는 앱에서 이것을 사용하고 있습니다.
[업데이트] 이전 버전 (<iOS 13)에서 앱이 다운되는 것을 관찰했지만 컴파일러는 버전 확인에 대해 불평하지 않았습니다. 누군가 왜 이런 일이 발생했는지 설명해주세요.
searchBar 내부의 UITextField에 액세스하여이를 수행 한 다음 배경색, 텍스트 색상 및 기타 모든 UITextField 속성을 변경할 수 있습니다.
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도 처리하려면 다음과 같이하십시오.
This will have the methods I want to handle and its set. 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
그런 다음 XIB / Storyboard에 설정하고 단순한 것처럼 처리합니다 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
// 편집하다
위의 코드는 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 # 버전입니다. UITextField가 향후 iOS 뷰 계층 구조에서 사라지더라도 충돌하지 않습니다.
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 :-
잘 작동합니다.
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
스위프트 5 :
searchBar[keyPath: \.searchTextField].textColor = UIColor(...)