UISearchBar 검색 텍스트 색상을 어떻게 변경할 수 있습니까?


답변:


108

UITextFieldUISearchBar 내부 에 액세스해야합니다 . 다음을 사용하여 수행 할 수 있습니다.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

1
내 대답을 수정했습니다. valueforkey ( "searchField")를 사용하여 필드에 액세스 할 수 있습니다.
Christian

7
비공개 API는 아니지만 매우 취약하고 모든 iOS 업데이트에서 중단 될 수 있습니다. 프로덕션 코드에서 이와 같은 것을 사용해서는 안됩니다
Lope

2
@Christian-원래 답변이 언제 게시되었는지는 중요하지 않지만 여전히 비공개 API에 의존합니다. 공개 된 경우 searchFieldKVC를 통해 액세스 할 필요가 없습니다 .
Greg Brown

1
반대 투표. @juanjo의 답변과 내 의견을 참조하여 Apple에서 승인 한 훨씬 더 강력한 접근 방식을 확인하고 깨질 가능성이 훨씬 적습니다.
RobP

1
이 답변을 사용하지 마십시오. 개인 API에 액세스하고 있으며 앱이 거부 될 수 있습니다.
aryaxt

63

스토리 보드 (코드없이)에서 UISearchBar에 대한 텍스트 색상을 설정하려는 경우에도 쉽게 수행 할 수 있습니다 (ID 검사기에서). 다음은 검색 창의 빨간색 텍스트입니다.

여기에 이미지 설명 입력


2
보기 요소에 대한 코드를 적게 사용하는 것이 좋습니다. 감사.
NRR 2015

완벽한 솔루션!
Mona

49

나를 위해 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]

나를 위해 일하고 있습니다.
Surjeet Rajput

모듈의 모든 검색 창의 색상이 변경됩니까?
Zaporozhchenko Oleksandr

48

어두운 배경에서만 읽을 수 있도록해야하는 경우 barStyle을 변경할 수 있습니다. 다음은 검색 창의 텍스트와 버튼을 흰색으로 만듭니다.

searchController.searchBar.barStyle = .black

@ 베이컨, 너무 도움이되었습니다! 감사합니다
Goppinath 2018 년

32
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
    }
}

당신처럼 솔루션. 감사.
Bagusflyer

또한 "searchField.backgroundColor"를 추가하여 막대 색조와 별도로 텍스트 필드의 배경색을 제어 할 수 있습니다.
Sherwin Zadeh

13

이것은 iOS 11, Xcode 9에서 나를 위해 작동합니다.

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue

나는 그것을 작성 AppDelegate하지만 다른 곳에두면 작동한다고 생각합니다.


3
이것은 허용되는 답변 및 기타 답변의 키-값 넌센스보다 훨씬 강력한 접근 방식입니다. 그러나 Apple은 현명하게 여기에서 사용하는 API를 폐기하고 iOS 9.0 이상을위한 새 버전을 제공합니다. 다음과 같이 : [[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];이것은 물론 Objective-C이며 Swift 로의 분명한 번역은 다음과 같습니다.appearance(whenContainedInInstancesOf:)
RobP

2
실제 장치에서 Xcode 10, iOS 12에서 작동하지 않는 것 같습니다.
Oded

10

내가 생각하는 가장 편리한 방법 textColorUISearchBar.

스위프트 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

나를 위해 일하지 않습니다. textcolor 속성은 언제 설정합니까?
Kingalione

1
@Kingalione 당신은 '()의 viewDidLoad'이 설정할 수 있습니다
탈 시온

네, placholder 텍스트 색상을 변경하고 싶었습니다. 이제 해결책을 찾았습니다. 감사 어쨌든
Kingalione

10

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")
    }
}

드디어! 텍스트 필드에 직접 액세스 할 수 있습니다. 고마워, Saren.
Mark Moeykens 19

4

이 시도,

searchBar.searchTextField.textColor = .white

iOS 11 이상을 대상으로하는 앱에서 이것을 사용하고 있습니다.

[업데이트] 이전 버전 (<iOS 13)에서 앱이 다운되는 것을 관찰했지만 컴파일러는 버전 확인에 대해 불평하지 않았습니다. 누군가 왜 이런 일이 발생했는지 설명해주세요.


3

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
    }
}

3

위에서 작성한 몇 가지 솔루션을 시도했지만 작동하지 않았습니다 (더 이상 추측합니다).

iOS 13 만 처리하려는 경우 :

mySearchBar.searchTextField.textColor = .red

그러나 이전 iOS도 처리하려면 다음과 같이하십시오.

This will have the methods I want to handle and its set. UISearchBar이라는 사용자 정의 클래스를 만듭니다 .SearchBar : UISearchBar, UISearchBarDelegateSearchBarUISearchBarDelegatedelegate

그리고 나는 수업에 추가합니다.

    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(대리자를 잊지 않았다면!).


2

(이 솔루션은 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 }
    }
}

iOS 13의 경우 return subviews.first? .subviews.last? .subviews.compactMap {$ 0 as? UITextField} .last
Taras

2

//이 사람 시도

yourSearchbar.searchTextField.textColor = .white

1

다음은 "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;
        }
    }
}

1

Swift 5.2 및 iOS 13.3.1 :-

잘 작동합니다.

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]


0

내 상황에서 해결책은

id appearance = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class, BCRSidebarController.class]];
[appearance setTextColor:[UIColor.whiteColor colorWithAlphaComponent:0.56]];

0

Obj-C

UITextField *textField = [self.yourSearchbar valueForKey:@"_searchField"];
textField.textColor = [UIColor redColor];

스위프트 4.x

let textField = yourSearchbar.value(forKey: "searchField") as? UITextField
textField?.textColor = UIColor.red

0

스위프트 5 :

searchBar[keyPath: \.searchTextField].textColor = UIColor(...)


0

Swift 5에서는 다음과 같이 할 수 있습니다.

yourSearchBar.searchTextField.textColor = .yourColor

0

이것은 나를 위해 일했습니다.

    if #available(iOS 13.0, *) {
     searchBar.searchTextField.textColor = .white
    }

-1

Swift 5 Xcode 11.4 iOS 13.4

    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = .white
    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = .systemFont(ofSize: 13)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.