webentwicklung-frage-antwort-db.com.de

Ändern Sie die Schriftgröße von UISearchBar

Wie kann ich die Schriftgröße von UISearchBar ändern?

Bearbeiten:
Antworten

for(int i =0; i<[searchbar.subviews count]; i++) {
        if([[searchbar.subviews objectAtIndex:i] isKindOfClass:[UITextField class]])
            [(UITextField*)[searchbar.subviews objectAtIndex:i] setFont:[UIFont fontWithName:@"Helvetica" size:12]];
    }

Vielen Dank
Pankaj

40
pankaj

Die UISearchBar enthält ein UITextField, aber es gibt keine Eigenschaft, um darauf zuzugreifen. Es gibt also keine Möglichkeit, dies auf eine übliche Weise zu tun.

Es gibt jedoch eine andere Art der Problemumgehung als Problemumgehung. UISearchBar erbt von UIView. Sie können auf die Unteransichten mit [searchBar-Unteransichten] ... zugreifen. Wenn Sie in der Konsole drucken, werden diese Unteransichten angezeigt .

UISearchBarBackground, UISearchBarTextField.

Um die Schriftgröße zu ändern, müssen Sie nur das tun

    UITextField *textField = [[searchBar subviews] objectAtIndex:1];
[textField setFont:[UIFont fontWithName:@"Helvetica" size:40]];

Wenn sich jedoch die UISearchBar in der Zukunft ändert und das Textfeld nicht mehr auf Position 1 steht, stürzt Ihr Programm ab. Es ist daher besser, die Position des UITextField durch die Unteransichten zu überprüfen und dann die Schriftgröße festzulegen.

14
Bruno Domingues

Ich empfehle noch eine andere Option für iOS 5.0 und höher:

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont systemFontOfSize:14]];

für iOS 8 (von Mike Gledhill verlinkt):

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{
            NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:20],
      }];

für iOS 9 und höher:

[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setDefaultTextAttributes:@{NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:20]}];

Auf diese Weise müssen Sie sich nicht mit der Auflistung von Unteransichten für jede Suchleiste in Ihrer App beschäftigen.

148

Der sichere Weg für diesen Vorgang ist wie folgt:

for(UIView *subView in searchBar.subviews) {
    if ([subView isKindOfClass:[UITextField class]]) {
        UITextField *searchField = (UITextField *)subView;
        searchField.font = [UIFont fontWithName:@"Oswald" size:11];
    }
}

Warum ist das sicherer als die akzeptierte Antwort? Weil es nicht darauf angewiesen ist, dass der Index des UITextField konstant bleibt. (es ist auch ein sauberer für Schleife)

16
Gavin Miller

Die akzeptierte Antwort ist nicht die empfohlene Methode zum Anwenden von Schriftarten für UISearchBar. Besser vermeiden Sie diesen Ansatz und verwenden Sie die Antworten von @rafalkitta oder @josema. 

Seien Sie jedoch vorsichtig, dies wird auf alle Suchleisten in der App angewendet. Um diesen Ansatz auf eine bestimmte Suchleiste anzuwenden, erstellen Sie eine Unterklasse von UISearchBar und setzen Sie die Variable defaultTextAttributes auf die Variable UITextField wie unten

Swift4 :

    let defaultTextAttribs = [NSAttributedStringKey.font.rawValue: UIFont.boldSystemFont(ofSize: 21.0), NSAttributedStringKey.foregroundColor.rawValue:UIColor.red]
    UITextField.appearance(whenContainedInInstancesOf: [CustomSearchBar.self]).defaultTextAttributes = defaultTextAttribs

Obj-C (iOS11)

    UIFont *font = [UIFont boldSystemFontOfSize:21.0];
    UIColor *color = [UIColor redColor];
    NSDictionary * defaultTextAttribs = @{NSFontAttributeName:font, NSForegroundColorAttributeName: color};
    [UITextField appearanceWhenContainedInInstancesOfClasses:@[[CustomSearchBar class]]].defaultTextAttributes = defaultTextAttribs;
12
Rishi

Sie können KVC (Key-Value Coding) verwenden, um das Textfeld abzurufen

UITextField *textField = [self.searchBar valueForKey: @"_searchField"];
[textField setTextColor:[UIColor redColor]];
[textField setFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:17.0]];
12
Adriano Spadoni

In Swift 2.0 für eine programmgesteuert erstellte Suchleiste können Sie Folgendes tun:

override func layoutSubviews() {
  super.layoutSubviews()

  let textFieldInsideSearchBar = self.searchBar.valueForKey("searchField") as! UITextField
  textFieldInsideSearchBar.font = UIFont.systemFontOfSize(20)
 }

In diesem Fall habe ich den Code in eine UIView-Unterklasse eingefügt, funktioniert aber auch an anderen Stellen (d. H. ViewWillAppear vom UIViewController).

11
Ciprian Rarau

In Swift 3 können Sie dies erreichen durch: 

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = UIFont(name: "AvenirNextCondensed-Regular", size: 17.0)
7
Ashildr

Das Aussehen von UITextField funktioniert nicht für UISearchBars, die programmgesteuert erstellt werden. Sie müssen eine rekursive Problemumgehung verwenden

- (void)viewDidLoad {
  [super viewDidLoad];
  [self recursivelySkinTextField:self.searchBar];
}

- (void)recursivelySkinTextField:(UIView *)view {
  if (!view.subviews.count) return;

  for (UIView *subview in view.subviews) {
    if ([subview isKindOfClass:[UITextField class]]) {
      UITextField *searchField = (UITextField *)subview;
      searchField.font = [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] font];
      searchField.textColor = [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] textColor];
    }
    [self recursivelySkinTextField:subview];
  }
}
5
Eugene

Ich wollte "Roboto-Regular" als Standardschriftart für alle Uisearchbars in meinem Projekt verwenden. Ich habe eine Uisearchbar-Erweiterung gemacht.

extension UISearchBar {
func addRobotoFontToSearchBar(targetSearchBar:UISearchBar?) -> UISearchBar
{
    let textFieldInsideSearchBar = targetSearchBar!.valueForKey("searchField") as! UITextField
    textFieldInsideSearchBar.font = UIFont(name: "Roboto-Regular", size: 15.0)

//UIBarButtons font in searchbar
let uiBarButtonAttributes: NSDictionary = [NSFontAttributeName: UIFont(name: "Roboto-Regular", size: 15.0)!] 
UIBarButtonItem.appearance().setTitleTextAttributes(uiBarButtonAttributes as? [String : AnyObject], forState: UIControlState.Normal)

    return targetSearchBar!
}
}

Verwendungszweck:

self.sampleSearchBar.addRobotoFontToSearchBar(sampleSearchBar)
3
A.G

Sie sollten keine private API wie in anderen Antworten verwenden. Wenn Sie Suchleisten in der gesamten Anwendung anpassen möchten, können Sie das Erscheinungsbild der Klasse verwenden. Ermöglicht das Ändern der Textattribute der Suchleiste, der Platzhalterattribute, der Schaltfläche "Abbrechen", des Hintergrundbilds für Textfelder, des Hintergrundbildes usw.

if #available(iOS 9.0, *) {
    let searchBarTextAttributes = [
        NSFontAttributeName: UIFont.boldSystemFont(ofSize: 12), 
        NSForegroundColorAttributeName: UIColor.red
    ]
    // Default attributes for search text
    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = searchBarTextAttributes

    // Attributed placeholder string
    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).attributedPlaceholder = NSAttributedString(string: "Search...", attributes: searchBarTextAttributes)

    // Search bar cancel button
    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes(searchBarTextAttributes, for: .normal)
    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "Cancel"
}
3
rafalkitta

Die rekursive Lösung von Eugene in Swift wurde umgeschrieben. Für meinen Fall musste ich die Schriftgröße ändern. Das hat bei mir funktioniert.

func findAndSetTextField(view: UIView)
{
    if (view.subviews.count == 0)
    {
        return
    }

    for var i = 0; i < view.subviews.count; i++
    {
        var subview : UIView = view.subviews[i] as UIView
       if (subview.isKindOfClass(UITextField))
       {
            var searchField : UITextField = subview as UITextField
            searchField.font = UIFont(name: "Helvetica", size: 19.0)!
        }
        findAndSetTextField(subview)
    }
}
2
epaus

der vollständige Code sollte unten stehen:

for (UIView *v in (SYSTEM_VERSION_LESS_THAN(@"7.0")?searchBar.subviews:[[searchBar.subviews objectAtIndex:0] subviews])) {

    if([v isKindOfClass:[UITextField class]]) {
        UITextField *textField = (UITextField *)v;
        [textField setFont:fREGULAR(@"15.0")];

        return;
    }
}
1
Trong Dinh

Versuchen Sie, die Suchleiste anhand ihres Schlüssels zu finden:

UITextField *searchField = [self.searchDisplayController.searchBar valueForKey:@"_searchField"];
searchField.font = [[UIFont fontWithName:@"Oswald" size:11];
1
theprojectabot

Fügen Sie unten den Code hinzu, an dem Sie Ihre UISearchBar definieren oder einrichten

Swift4: 

UILabel.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = UIFont.init(name: "Ubuntu-Regular", size: 16)
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = UIFont.init(name: "Ubuntu-Regular", size: 16)

Ziel c:

[[UILabel appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont fontWithName:@"Helvetica" size:12.0]];
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont fontWithName:@"Helvetica" size:12.0]];
0
Vinayak Pal

Für Swift 4.2 +

let defaultTextAttributes = [
    NSAttributedString.Key.font: UIFont.init(name: "Ubuntu-Regular", size: 16),
    NSAttributedString.Key.foregroundColor: UIColor.gray
]
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = defaultTextAttributes
0
Elliott Yang