2013-05-14 2 views
43

Я хочу иметь возможность установить шрифт кнопки навигации на панели навигации приложений, не делая ничего сумасшедшего и не теряя никаких других дизайнерских характеристик кнопки (т.е. я хочу сохранить стрелку) ,Изменить шрифт кнопки обратной панели навигации

Прямо сейчас я использую это в viewDidAppear:, чтобы установить шрифт элементов обычной панели.

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

Однако это не делает никаких изменений на кнопку назад, независимо от того, какого UIViewController этого кода применяются к (корень, ток и т.д.).

+0

Пользовательские стилизация UIBarButton пунктов: http://stackoverflow.com/a/28347428/469614 – Vexy

ответ

108

Чтобы изменить внешний вид текста во всех UIBarButtonItems появляющегося во всех UINavigationBars, сделайте следующее 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 версия

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:

Примечание: это меняет все экземпляры UIBarButtonItem, а не только те, которые содержатся в UINavigationBar

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

Swift3:. UIBarButtonItem.appearance() setTitleTextAttributes ([NSFontAttributeName: UIFont (имя : «FontName-Regular», размер: 14.0)!], Для: .normal)

+1

Это, безусловно, более простой способ сделать это, и это применимо ко всем будущим элементам кнопки бара, а не только к кнопке «Назад». – zachjs

+1

Хорошо работает. Примечание UITextAttributeTextColor и т. Д. Устарели в iOS 7. – LordParsley

+0

Спасибо !. Это работает для меня. – Raja

1

Используйте это вместо того, чтобы в вашем AppDelegate или где NavigationController инициализируется, метод доступен в прошивке 5 и выше

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

Это не действительно полный ответ, поскольку настроенный backButton не используется. –

+0

@MikePollard вопрос сказал, чтобы изменить шрифт не как использовать кнопку. если вы хотите знать, как его использовать, вы должны спросить. –

6

Для тех, кто не получил этого полностью, вот как я это сделал, в том числе и вернулся к Root ViewController в 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]; 
} 

Может быть кто-то, возможно, придется использовать это.

+0

Не будет работать с локалями и выбрасывает предварительно настроенные подсказки доступности, необходимые для получения приложения в IAS. Вы всегда должны использовать кнопки, предоставленные системой, если вы не хотите делать много дополнительной работы. – Barry

0

Если вы используете новый UISplitViewControllerDelegate для разделенных видов в iOS 8, вышеуказанные методы не будут работать, потому что новый displayModeButtonItem работает по-другому.

Вам необходимо установить шрифт при создании displayModeButtonItem.Предполагая, что вы шаблон Apple, это, вероятно, в prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender, где вы могли бы сделать что-то вроде этого:

// 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

На самом деле после большего тестирования я не думаю, что это работает. Если у кого-то есть представление о том, как изменить шрифт на 'displayModeButtonItem', дайте мне знать. – Nick

4

Swift версии всех упомянутых выше (отрывок из original answer):

let customFont = UIFont(name: "customFontName", size: 17.0)! 
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: customFont], forState: .normal) 

Больше положительных героев :
https://stackoverflow.com/a/28347428/469614

2

В 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 

Примечание: вам нужно сделать это только один раз для контроллера навигации.

1

Swift 3.0+

AppDelegate.swift

UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.font: UIFont(name: "myFont", size: 17.0)!], for: .normal) 
Смежные вопросы