webentwicklung-frage-antwort-db.com.de

in iOS 11 können Sie die Suchleiste in der Navigationsleiste anpassen

Ich möchte die Farbe von Text und Symbol in der iOS 11-Suchleiste ändern, wenn sie in die Navigationsleiste eingebettet ist. Also Platzhaltertext, Suchtext und Suchsymbol.

 enter image description here

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
}

Wie Sie im Bild sehen können, ist der Text auf einem tiefblauen Hintergrund grau, was unschön aussieht. Ich möchte, dass Text und Symbol mindestens weiß sind. (das Ändern der blauen Hintergrundfarbe funktioniert auch nicht wirklich gut, siehe meine andere Frage )

Das einzige, was funktioniert, ist das Ändern der Farbe des blinkenden Cursors und der Schaltfläche "Abbrechen", die mit der .tintColor -Eigenschaft ausgeführt wird.

Lösungen, die unter iOS 10 und darunter zu funktionieren scheinen, scheinen unter iOS 11 nicht mehr zu funktionieren. Bitte posten Sie nur Lösungen, die Sie unter iOS 11 kennen. Vielen Dank.

Vielleicht vermisse ich den Punkt zu diesem "automatischen Styling" in iOS 11. Jede Hilfe wird geschätzt.

35
Darko

Ich habe gerade herausgefunden, wie ich auch den Rest einstellen kann: (mit Hilfe von Brandon, danke!)

Der Text "Abbrechen":

searchController.searchBar.tintColor = .white

Das Suchsymbol:

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

Das klare Symbol:

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

Der Suchtext:

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

Danke für die Hilfe @Brandon!

 enter image description here

Der Platzhalter:

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

 enter image description here

Der weiße Hintergrund:

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

Aus hier .

93
Darko

Legen Sie die Suchtextfarbe fest

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

Legen Sie die Farbe des Suchplatzhalters fest 

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

Stellen

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

und

UISearchBar.appearance().tintColor = UIColor.white im AppDelegate.

Alternativ können Sie beide in [UIViewController viewDidLoad:]

3
Brandon

Zusätzlich zu Darkos Antwort . In meinem Fall muss ich eine rein weiße Suchfeldfarbe erhalten. Außerdem brauche ich eine benutzerdefinierte borderLine und cornerRadius. Wenn ich nur die Hintergrundfarbe auf weiß gesetzt habe, muss die benutzerdefinierte Ecke festgelegt werden Radius und benutzerdefinierte Begrenzungslinie Ich habe so etwas wie ... .. /.  Look at this ugly grey highLight when you tap on textfield

Das Problem ist, dass die Suchleiste einige Unteransichten hat und ich sie gerade entfernt habe ... Hier ist mein 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;
}
}

Jetzt habe ich eine Suchleiste mit reinem weißem Hintergrund, benutzerdefiniertem cornerRadius und benutzerdefinierter Randbreite. Ich habe auch die graue Markierung deaktiviert, wenn Sie auf . tippen. Editing searchfield  Resign first responder

1
Alex Kolovatov

meine zwei Cents für Swift 4.x, leicht aufgeräumt.

Hinzufügen in Controller oder App Delegate:

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

im Controller:

self.searchBar.barTintColor = .blue

Sie erhalten blauen Hintergrund, grünen Suchbalkenhintergrund und rote kursive Schrift:

 enter image description here

0
ingconti

Ich habe die Daroko-Lösung ausprobiert, aber ich hatte ein Problem, als ich den Hintergrund auf reine weiße Farbe umstellte (es war grau). Meine Lösung bestand darin, das setSearchFieldBackgroundImage zu verwenden. Ich möchte mich auch nicht auf Apple struct verlassen, um das UITextField zu bekommen

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

Ich habe die UIImage-Erweiterung von: IImage mit Volltonfarbe in Swift erstellen verwendet

0
Gal Danay