web-dev-qa-db-ja.com

UISearchController iOS 11のカスタマイズ

UISearchController検索バーの外観をカスタマイズするために、iOS 11より前の次のコードを使用していました。

var searchController = UISearchController(searchResultsController: nil)
searchController.searchBar.setDefaultSearchBar()
searchController.searchResultsUpdater = self

if #available(iOS 11.0, *) {
    navigationItem.searchController = searchController
} else {
    tableView.tableHeaderView = searchController.searchBar
}

extension UISearchBar {
    func setDefaultSearchBar() {
        self.tintColor = UIColor.blue
        self.searchBarStyle = .minimal
        self.backgroundImage = UIImage(color: UIColor.clear)
        let searchBarTextField = self.value(forKey: "searchField") as! UITextField
        searchBarTextField.textColor = UIColor.white
        searchBarTextField.tintColor = UIColor.blue
        searchBarTextField = .dark
    }
}

ただし、iOS 11に更新し、UISearchControllernavigationItemanyカスタマイズの一部として追加した(キーボードの外観の証明を除く)私のコードが呼び出されています)が表示されません。これはバグですか、それとも間違って実装していますか?

EDIT:添付されているのは、iOS 10(最初)とiOS 11を実行しているデバイスの2つのスクリーンショットです

enter image description here

enter image description here

EDIT 2:これまでのところ、この質問に対する注意の多くは、UISearchBarのテキストの色に焦点を当てています。私はこれ以上を見ています-背景色、色合い、検索インジケータ、クリアボタンの色などallはカスタマイズできませんiOS 10で完全に実行できるにもかかわらず、iOS 11を実行しているデバイスで。

51

私はちょうどそれらを設定する方法を見つけました:(ブランドンとクルナルの助けを借りて、ありがとう!)

「キャンセル」テキスト:

searchController.searchBar.tintColor = .white

検索アイコン:

searchController.searchBar.setImage(UIImage(named: "my_search_icon"), for: UISearchBarIcon.search, state: .normal)

明確なアイコン:

searchController.searchBar.setImage(UIImage(named: "my_search_icon"), for: UISearchBarIcon.clear, state: .normal)

検索テキスト:

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

enter image description here

プレースホルダー:

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).attributedPlaceholder = NSAttributedString(string: "placeholder", attributes: [NSAttributedStringKey.foregroundColor: UIColor.white])

enter image description here

白い背景:

if #available(iOS 11.0, *) {
    let sc = UISearchController(searchResultsController: nil)
    sc.delegate = self
    let scb = sc.searchBar
    scb.tintColor = UIColor.white
    scb.barTintColor = UIColor.white

    if let textfield = scb.value(forKey: "searchField") as? UITextField {
        textfield.textColor = UIColor.blue
        if let backgroundview = textfield.subviews.first {

            // Background color
            backgroundview.backgroundColor = UIColor.white

            // Rounded corner
            backgroundview.layer.cornerRadius = 10;
            backgroundview.clipsToBounds = true;
        }
    }

    if let navigationbar = self.navigationController?.navigationBar {
        navigationbar.barTintColor = UIColor.blue
    }
    navigationItem.searchController = sc
    navigationItem.hidesSearchBarWhenScrolling = false
}

enter image description here

here から取得。

66
Darko

検索バーに入力したテキストを適切に白に設定するには(暗いフィールドの色を使用する場合):

searchController.searchBar.barStyle = .black

テキストフィールドの背景色を設定するには

if #available(iOS 11.0, *) {

        if let textfield = searchController.searchBar.value(forKey: "searchField") as? UITextField {
            if let backgroundview = textfield.subviews.first {

                // Background color
                backgroundview.backgroundColor = UIColor.white

                // Rounded corner
                backgroundview.layer.cornerRadius = 10;
                backgroundview.clipsToBounds = true;
            }
        }
    }

ただし、次のようなものを使用する

textfield.textColor = UIColor.blue

上記では動作しないようです。

9
Zyntx

検索バーのバースタイルを設定してみてください。

searchController.searchBar.barStyle = UIBarStyleBlack;

image 1

5
Eddie Hsu

UISearchBarの基になるUITextFieldを見つけて、テキストの色を変更する必要があります。

これは、検索コントローラーが表示(UISearchControllerDelegate.willPresentSearchController)または表示される場合にのみ効果があることに注意してください。

class ViewController : UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // setup your search controller...

        // set search controller's delegate
        navigationItem.searchController?.delegate = self
    }
}

extension ViewController : UISearchControllerDelegate {

    func willPresentSearchController(_ searchController: UISearchController) {
        // update text color
        searchController.searchBar.textField?.textColor = .white
    }
}

extension UISearchBar {

    var textField: UITextField? {
        for subview in subviews.first?.subviews ?? [] {
            if let textField = subview as? UITextField {
                return textField
            }
        }
        return nil
    }
}
4
Jonny

setDefaultSearchBarへの呼び出しをviewDidAppearに移動すると、これを修正する必要があります。

4
highmaintenance
    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
3
Isa M

試してください:searchController.<YOUR SEARCHBAR>.barStyle = .blackOpaqueの代わりにself.searchBarStyle = .minimal

副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example:

var searchController = UISearchController(searchResultsController: nil)
searchController.searchBar.setDefaultSearchBar()
//Add this line below
searchController.searchBar.barStyle = .blackOpaque
searchController.searchResultsUpdater = self

if #available(iOS 11.0, *) {
    navigationItem.searchController = searchController
} else {
    tableView.tableHeaderView = searchController.searchBar
}

extension UISearchBar {
    func setDefaultSearchBar() {
        self.tintColor = UIColor.blue
        //Delete this line below
        self.searchBarStyle = .minimal
        self.backgroundImage = UIImage(color: UIColor.clear)
        let searchBarTextField = self.value(forKey: "searchField") as! UITextField
        searchBarTextField.textColor = UIColor.white
        searchBarTextField.tintColor = UIColor.blue
        searchBarTextField = .dark
    }
}
1
Hoff Silva

SearchBarのtextFieldの背景色を変更する必要がある場合は、ここでの私の答えを参照してください: https://stackoverflow.com/a/46315974/1109892

1
Adam Studenic

UISearchBar内のUITextFieldにアクセスする必要があります。あなたはそれを使用してそれを行うことができます

let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField

textFieldInsideSearchBar?.textColor = yourcolor

OR

enter image description here

0
yogesh wadhwa