2013-05-14 19 views
43

Chcę móc ustawić czcionkę przycisku wstecz w pasku nawigacyjnym moich aplikacji, nie robiąc niczego zbyt szalonego i nie tracąc żadnych innych cech charakterystycznych tego przycisku (tj. Chcę zachować strzałkę) .Zmiana czcionki przycisku paska nawigacji wstecznej

Teraz używam tego w viewDidAppear:, aby ustawić czcionkę zwykłego elementu przycisku paska.

for (NSObject *view in self.navigationController.navigationBar.subviews) { 
    if ([view isKindOfClass:[UIButton class]]) { 
     [((UIButton*)view).titleLabel setFont:[UIFont 
           fontWithName:@"Gill Sans" 
             size:14.0]]; 
    } 
} 

Jednak to sprawia, że ​​nie ma zmiany na przycisk wstecz, niezależnie od UIViewController kod ten jest stosowany do (korzeń, prąd, itd.).

+0

klienta stylizacja przedmiotów UIBarButton: http://stackoverflow.com/a/28347428/469614 – Vexy

Odpowiedz

108

Aby zmienić wygląd tekstu we wszystkich UIBarButtonItems występującego we wszystkich UINavigationBars, wykonaj następujące czynności w application:didFinishLaunchingWithOptions:

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes: 
    @{UITextAttributeTextColor:[UIColor blackColor], 
    UITextAttributeTextShadowOffset:[NSValue valueWithUIOffset:UIOffsetMake(0, 1)], 
    UITextAttributeTextShadowColor:[UIColor whiteColor], 
    UITextAttributeFont:[UIFont boldSystemFontOfSize:12.0] 
    } 
    forState:UIControlStateNormal]; 

UPDATE: iOS7 wersja

NSShadow *shadow = [[NSShadow alloc] init]; 
shadow.shadowOffset = CGSizeMake(0.0, 1.0); 
shadow.shadowColor = [UIColor whiteColor]; 

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] 
setTitleTextAttributes: 
@{NSForegroundColorAttributeName:[UIColor blackColor], 
    NSShadowAttributeName:shadow, 
    NSFontAttributeName:[UIFont boldSystemFontOfSize:12.0] 
    } 
forState:UIControlStateNormal]; 

Swift:

UWAGA: zmienia wszystkie instancje UIBarButtonItem, a nie tylko te zawarte w UINavigationBar

UIBarButtonItem.appearance() 
       .setTitleTextAttributes([NSFontAttributeName : ExamplesDefaults.fontWithSize(22)], 
             forState: UIControlState.Normal) 

Swift3. UIBarButtonItem.appearance() setTitleTextAttributes ([NSFontAttributeName: UIFont (nazwa : "FontName-Regular", rozmiar: 14.0)!], Dla: .normal)

+1

Jest to zdecydowanie prostszy sposób na wykonanie tej czynności i dotyczy wszystkich przyszłych elementów przycisku paska, a nie tylko przycisku Wstecz. – zachjs

+1

Działa dobrze. Uwaga UITextAttributeTextColor, itp. Przestarzałe w iOS 7. – LordParsley

+0

Dziękujemy !. To działa dla mnie. – Raja

1

Użyj tego zamiast w AppDelegate lub gdy NavigationController jest inicjowany, metoda dostępna w iOS 5 i powyżej

UIBarButtonItem *backbutton = [[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStyleBordered target:nil action:nil]; 
[backbutton setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: 
                [UIColor blackColor],UITextAttributeTextColor,[UIFont fontWithName:TEXTFONT size:16.0f],UITextAttributeFont, 
                nil] forState:UIControlStateNormal]; 
+1

To nie jest naprawdę kompletna odpowiedź, ponieważ skonfigurowany backButton nie jest używany. –

+0

@MikePollard pytanie, które mówi, aby zmienić czcionkę, a nie jak korzystać z przycisku. jeśli chcesz wiedzieć, jak go używać, powinieneś zapytać. –

6

Dla każdego, kto nie ma w pełni tego do roboty, oto jak to zrobiłem, włączając w to powrót do Root ViewController w IOS7 :

UIBarButtonItem *backBtn =[[UIBarButtonItem alloc]initWithTitle:@"Back" style:UIBarButtonItemStyleDone target:self action:@selector(popToRoot:)]; 
backBtn.title = @"Back"; 
[backBtn setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: 
           [UIFont fontWithName:@"Chalkduster" size:15], NSFontAttributeName, 
           [UIColor yellowColor], NSForegroundColorAttributeName, 
           nil] 
         forState:UIControlStateNormal]; 

self.navigationItem.leftBarButtonItem=backBtn; 

popToRoot ViewController:

- (IBAction)popToRoot:(UIBarButtonItem*)sender { 
[self.navigationController popToRootViewControllerAnimated:YES]; 
} 

Może ktoś może mieć zastosowanie tego produktu.

+0

Nie działa z ustawieniami regionalnymi i odrzuca prekonfigurowane wskazówki dotyczące ułatwień dostępu potrzebne do zainstalowania aplikacji w usłudze IAS. Powinieneś zawsze używać przycisków dostarczonych przez system, chyba że chcesz wykonać dużo dodatkowej pracy. – Barry

0

Jeśli używasz nowego UISplitViewControllerDelegate do podziału widoków w iOS 8, powyższe metody nie będą działać, ponieważ nowy displayModeButtonItem działa nieco inaczej.

Musisz ustawić czcionkę podczas tworzenia displayModeButtonItem.Zakładając, że jesteś po szablony Apple to prawdopodobnie w prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender gdzie byś zrobił coś takiego:

// From Apple's Template: 
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
NSManagedObject *object = [[self fetchedResultsController] objectAtIndexPath:indexPath]; 
DetailViewController *controller = (DetailViewController *)[[segue destinationViewController] topViewController]; 
[controller setDetailItem:object]; 
controller.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem; 
controller.navigationItem.leftItemsSupplementBackButton = YES; 
// New Line to set the font: 
[controller.navigationItem.leftBarButtonItem setTitleTextAttributes:@{NSFontAttributeName : [UIFont fontWithName:@"SourceSansPro-Regular" size:14]} forState:UIControlStateNormal]; 
+0

Po kolejnych testach nie sądzę, żeby to działało. Jeśli ktoś ma pomysł, jak zmienić czcionkę na 'displayModeButtonItem' daj mi znać. – Nick

2

W Swift3:

let font = UIFont(name: "Verdana", size: 10.0) 

// Back button 
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: font!], for: UIControlState.normal) 

// Title in the navigation item 
let fontAttributes = [NSFontAttributeName: font] 
self.navigationController?.navigationBar.titleTextAttributes = fontAttributes 

Uwaga: należy to zrobić tylko raz dla kontrolera nawigacyjnego.

1

Swift 3.0+

AppDelegate.swift

UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.font: UIFont(name: "myFont", size: 17.0)!], for: .normal)