it-swarm.com.ru

iOS 11 UISearchBar в UINavigationBar

Я хочу разместить панель поиска в новой панели навигации с новыми iOS 11 большими заголовками. Тем не менее, цвет панели поиска автоматически применяется iOS, и я не могу его изменить. 

if #available(iOS 11.0, *) {
    let sc = UISearchController(searchResultsController: nil)
    navigationItem.searchController = sc
    navigationItem.hidesSearchBarWhenScrolling = false
}

Панель поиска получает темно-синий фон, но я просто хочу изменить его на белый. 

 enter image description here

Установка цвета фона приводит к этому:

navigationItem.searchController?.searchBar.backgroundColor = UIColor.white

 enter image description here

Я пробовал также setScopeBarButtonBackgroundImage и setBackgroundImage в строке поиска, но все выглядит совершенно странно.

Также, когда я запускаю поиск, нажимая на строку поиска, он переключается в режим с кнопкой отмены справа. («Abbrechen» на немецком языке)

 enter image description here

И цвет текста «Abbrechen» также нельзя изменить. (нужно тоже белое)

Любая помощь приветствуется.

Правка: По запросу, вот код для стиля панели навигации:

self.navigationBar.tintColor = UIColor.myWhite
self.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.myWhite, NSAttributedStringKey.font: UIFont.myNavigationBarTitle()]
self.navigationBar.barTintColor = UIColor.myTint

if #available(iOS 11.0, *) {
    self.navigationBar.prefersLargeTitles = true
    self.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.myWhite, NSAttributedStringKey.font: UIFont.myNavigationBarLargeTitle()]
}

Текущий результат: Я использовал идею Круналса, чтобы установить цвет фона панели поиска, но затем закругленные углы теряются. После переустановки закругленных углов анимация панели поиска, похоже, нарушена.

 enter image description here

Так что до сих пор нет удовлетворительного решения. Похоже, что панель поиска при встраивании в панель навигации в iOS 11 не представляется возможным настроить. Между тем мне было бы достаточно просто изменить цвет текста заполнителя, но даже это кажется невозможным. (Я пробовал несколько подходов из StackOverflow - не работает)

17
Darko

Теперь это то, что вы хотите ...

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

 enter image description here


с закругленным углом:
Анимация с закругленным углом тоже работает нормально.

 enter image description here

18
Krunal

Цель С

if (@available(iOS 11.0, *)) {
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    self.searchController.searchResultsUpdater = self;
    self.searchController.searchBar.delegate = self;
    self.searchController.dimsBackgroundDuringPresentation = NO;
    self.navigationItem.searchController=self.searchController;
    self.navigationItem.hidesSearchBarWhenScrolling=NO;
    self.searchController.searchBar.searchBarStyle = UISearchBarStyleProminent;
    self.searchController.searchBar.showsBookmarkButton = NO;
    self.searchController.searchBar.placeholder = @"Search";
    self.searchController.searchBar.tintColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1];
    self.searchController.searchBar.barTintColor=[UIColor colorWithRed:1 green:1 blue:1 alpha:1];
    UITextField *txfSearchField = [self.searchController.searchBar valueForKey:@"_searchField"];
    txfSearchField.tintColor=[UIColor colorWithRed:21/255.0 green:157/255.0 blue:130/255.0 alpha:1];
    txfSearchField.textColor=[UIColor colorWithRed:1 green:1 blue:1 alpha:1];
    txfSearchField.backgroundColor=[UIColor whiteColor];
    UIView *backgroundview= [[txfSearchField subviews]firstObject ];
    backgroundview.backgroundColor=[UIColor whiteColor];
    // Rounded corner
    backgroundview.layer.cornerRadius = 8;
    backgroundview.clipsToBounds = true;
}
2
nkitku

Я изменил фон текстового поля с помощью этого кода внутри AppDelegate. 

Swift 4 

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        //background color of text field
         UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).backgroundColor = .cyan

        }

Это результат

 example used to change the background to cyan color

2
Maruta

Вот код, который я использовал, чтобы сделать панель поиска белым:

if let textfield = searchController.searchBar.value(forKey: "searchField") as? UITextField {
            if let backgroundview = textfield.subviews.first {
                backgroundview.backgroundColor = UIColor.init(white: 1, alpha: 1)
                backgroundview.layer.cornerRadius = 10
                backgroundview.clipsToBounds = true
            }
        }

 enter image description here

2
iOS_Mouse

Это должно работать для вас

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

            if let navigationbar = self.navigationController?.navigationBar {
                //navigationbar.tintColor = UIColor.green
                //navigationbar.backgroundColor = UIColor.yellow
                navigationbar.barTintColor = UIColor.blue
            }

            navigationController?.navigationBar.tintColor = UIColor.green
            navigationItem.searchController = sc
            navigationItem.hidesSearchBarWhenScrolling = false
        }
}


Результат:

 enter image description here

 enter image description here

1
Krunal

Попробуйте этот код,

UITextField *txfSearchField = [_searchBar valueForKey:@"_searchField"];
txfSearchField.backgroundColor = [UIColor redColor];
0
AshokPolu