iOS 11 pas de zoekbalk in de navigatiebalk aan

Ik wil de kleur van de tekst en het pictogram in de iOS 11-zoekbalk wijzigen wanneer deze zijn ingesloten in de navigatiebalk. Dus plaatsaanduidingstekst, zoektekst en zoekpictogram.

voer hier de afbeeldingsbeschrijving in

if #available(iOS 11.0, *) {
    navigationController?.navigationBar.prefersLargeTitles = false
    let searchController = UISearchController(searchResultsController: nil)
    navigationItem.searchController = searchController
    navigationItem.hidesSearchBarWhenScrolling = false
    searchController.searchBar.placeholder = "Suchen"
    searchController.searchBar.tintColor = .white
}

Zoals je op de afbeelding kunt zien, is de tekst grijs op een diepblauwe achtergrond, wat er lelijk uitziet. Ik wil dat tekst en pictogram op zijn minst wit zijn. (het veranderen van de blauwe achtergrondkleur werkt ook niet echt goed, zie mijn andere vraag)

Het enige dat werkt, is het veranderen van de kleur van de knipperende cursor en de “cancel”-knop, wat wordt gedaan met de eigenschap .tintColor.

Oplossingen die lijken te werken in iOS 10 en lager, lijken niet meer te werken in iOS 11, dus post alleen oplossingen waarvan u weet dat ze werken in iOS 11. Bedankt.

Misschien mis ik het punt over deze “automatische styling” in iOS 11. Alle hulp wordt op prijs gesteld.


Antwoord 1, autoriteit 100%

Ik heb net ontdekt hoe ik ook de rest kan instellen: (met wat hulp van Brandon, bedankt!)

De tekst “Annuleren”:

searchController.searchBar.tintColor = .white

Het zoekpictogram:

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

Het duidelijke pictogram:

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

De zoektekst:

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

Bedankt voor de hulp @Brandon!

voer hier de afbeeldingsbeschrijving in

De tijdelijke aanduiding:

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

voer hier de afbeeldingsbeschrijving in

De witte achtergrond:

let searchController = UISearchController(searchResultsController: nil)
searchController.delegate = self
let searchBar = searchController.searchBar
searchBar.tintColor = UIColor.white
searchBar.barTintColor = UIColor.white
if let textfield = searchBar.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 = searchController
navigationItem.hidesSearchBarWhenScrolling = false

voer hier de afbeeldingsbeschrijving in

Genomen van hier.


Antwoord 2, autoriteit 2%

Zet

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSForegroundColorAttributeName: UIColor.white]

en

UISearchBar.appearance().tintColor = UIColor.whitein de AppDelegate.

U kunt ze ook allebei in [UIViewController viewDidLoad:]

plaatsen


Antwoord 3, autoriteit 2%

In aanvulling op het antwoord van Darko.
In mijn geval moet ik een puur witte zoektekstveldkleur krijgen.
Ook heb ik een aangepaste borderLine en cornerRadius nodig.
Dus als ik de achtergrondkleur gewoon op wit zet, een aangepaste hoekradius en een aangepaste grenslijn instel, heb ik zoiets als dit.
Kijk naar deze lelijke grijze highLight als je op het tekstveld tikt

Het probleem is dat de zoekbalk enkele subweergaven heeft en ik heb ze zojuist verwijderd.
Hier is mijn code:

@interface YourViewController () <UISearchBarDelegate, UISearchControllerDelegate>
// your properties
@property (nonatomic,strong) UISearchController *searchController;
@property (nonatomic,strong) UISearchBar *searchBar;
@end
- (void)viewDidLoad {
[super viewDidLoad];
_searchController = [[UISearchController alloc] initWithSearchResultsController:self.resultsTableController];
_searchController.delegate = self;
_searchController.searchBar.delegate = self;
_searchBar = self.searchController.searchBar;
if (@available(iOS 11.0, *)) {
    UITextField *searchTextField = [_searchBar valueForKey:@"searchField"];
if (searchTextField != nil) {
        searchTextField.layer.cornerRadius = 4.f;
        searchTextField.layer.borderWidth = 1.f;
        searchTextField.clipsToBounds = YES;
        for (UIView *subView in searchTextField.subviews) {
            [subView removeFromSuperview];
        }
}
// Color for "Cancel" button
    _searchBar.tintColor = [UIColor blackColor];
// Add searchController to navgationBar
    _navigationItem.searchController = _searchController;
// Hide searchBar when scroll
    _navigationItem.hidesSearchBarWhenScrolling = YES;
}
}

Nu heb ik een zoekbalk met een puur witte achtergrond, aangepaste cornerRadius, aangepaste randbreedte. Ook heb ik grijze markering bij tikken uitgeschakeld.
Zoekveld bewerken
Ontslag eerstehulpverlener


Antwoord 4, autoriteit 2%

Stel de kleur van de zoektekst in

(UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]) ).defaultTextAttributes = [NSForegroundColorAttributeName: UIColor.white]

Stel de kleur van de tijdelijke aanduiding voor zoeken in

(UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]) ).attributedPlaceholder = [NSForegroundColorAttributeName: UIColor.white]

Antwoord 5

mijn twee cent voor Swift 4.x, lichtjes opgeruimd.

Voeg controller of app-afgevaardigde toe:

appearance.backgroundColor = .green
let myFont = UIFont.italicSystemFont(ofSize: 12)
let attribs = [
    NSAttributedString.Key(rawValue: NSAttributedString.Key.font.rawValue): myFont,
    NSAttributedString.Key(rawValue: NSAttributedString.Key.foregroundColor.rawValue): UIColor.red
]
appearance.defaultTextAttributes =  attribs

in controller:

self.searchBar.barTintColor = .blue

Je krijgt een blauwe achtergrond, een groene achtergrond in de zoekbalk, een rood cursief lettertype:

voer hier de afbeeldingsbeschrijving in


Antwoord 6

Ik heb de Daroko-oplossing geprobeerd, maar ik had een probleem bij het veranderen van de achtergrond in puur witte kleur (het was grijs).
Mijn oplossingwas om de setSearchFieldBackgroundImagete gebruiken. ook wil ik niet vertrouwen op Apple struct voor het verkrijgen van het UITextField

 if #available(iOS 11.0, *) {
     let whiteImage = UIImage(color: UIColor.white, size: CGSize(width: searchController.searchBar.layer.frame.width, height: searchController.searchBar.layer.frame.height))
     searchController.searchBar.setSearchFieldBackgroundImage(whiteImage, for: .normal)
     self.navigationItem.searchController = searchController
     self.navigationItem.hidesSearchBarWhenScrolling = true
 }
public extension UIImage {
  public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
    let rect = CGRect(origin: .zero, size: size)
     UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
     color.setFill()
     UIRectFill(rect)
     let image = UIGraphicsGetImageFromCurrentImageContext()
     UIGraphicsEndImageContext()
     guard let cgImage = image?.cgImage else { return nil }
     self.init(cgImage: cgImage)
} }

Ik heb de UIImage-extensie gebruikt van:
Maak UIImage met effen kleuren in Swift


Antwoord 7

Als iemand vastloopt en zich afvraagt ​​waarom Darkos-oplossingniet werkt, probeer dan de stijl van de UINavigationBar te veranderen in defaultin plaats van black. Het kostte me een halve dag om erachter te komen ¯\_(ツ)_/¯


Antwoord 8

Deze code verandert de achtergrondkleur van het tekstveld

Swift 4

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        //background color of text field
         UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).backgroundColor = .cyan
        }

bewerkt: voorbeeld van een UISearchBar in cyaan

voorbeeld

Other episodes