web-dev-qa-db-ja.com

iOS 7のtitleTextAttributes UIAppearanceフォント

UIAppearanceを使用してUINavigationBarとUIBarButtonItemにフォントを適用していますが、問題があります。私はこのコードを実行しました:

[[UIBarButtonItem appearanceWhenContainedIn:[UIToolbar class], nil] 
setTitleTextAttributes:
@{NSFontAttributeName : [UIFont fontWithName:@"My_Font" size:17.0]} 
forState:UIControlStateNormal];

NSLog(@"%@", [[UIBarButtonItem appearanceWhenContainedIn:
[UIToolbar class], nil] titleTextAttributesForState:UIControlStateNormal]);

iOS 7でのそのログの結果は次のとおりです。

(null)

IOS 6の結果は次のとおりです。

{
    NSFont = "<UICFFont: 0x1d897a80> font-family: \"My_Font\"; font-weight: normal; font-style: normal; font-size: 17px";
}

IOS 7のドキュメントには、これが機能しないはずであるということを示すものはありませんが、他の誰かがこの問題を抱えていますか?

Edit 1

私は実際にこれを[UINavigationBar appearance]問題は、 NSString UIKit Additions Reference で説明されているように、フォントをデフォルトのnavbar/barButtonItemサイズに設定するためにポイントサイズを0に設定していたことでしたが、これは明らかに動作しませんiOS 7では、ポイントサイズを0に設定すると、システムフォントが返されます。

titleTextAttributesをまだ設定できません

[UIBarButtonItem appearanceWhenContaintedIn:[UIToolbar class], nil]]

30
LOP_Luke
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont 
    fontWithName:@"YOURFONT" size:14], NSFontAttributeName, 
    [UIColor whiteColor], NSForegroundColorAttributeName, nil];

[[UINavigationBar appearance] setTitleTextAttributes:attributes];

キーはNSFontAttributeNameなどを使用することです。私は、彼らがNS 64ビット互換性のための多様性を使用することに移行していると思います。上記のコードは私のiOS7デバイスで機能しました。

49
TMilligan

@Alex Zavatoneの答えに従って-それはたった1行のコードでうまくできます:

self.navBar.titleTextAttributes = @{
    NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue-Light" size:20.0], 
    NSForegroundColorAttributeName: [UIColor redColor]
};
18

これは、View ControllerのviewDidLoadメソッドに移動したときにiOS 7で正常に機能しました。

[[UIBarButtonItem appearance] setTitleTextAttributes:attributes];

AppDelegateでこれを行おうとしてもうまくいきませんでしたが、[[UINavigationBar appearance] setTitleTextAttributes:setTitleTextAttributes:attributes];はAppDelegateでうまくいきました。また、バーボタンを作成して割り当てる前に実行する必要があります。

Storyboardでバーボタンを作成する場合、initWithCoderメソッドからも機能します。

更新:デプロイメントターゲットを7.0に変更すると、Xcodeは、たとえばUITextAttributeTextColorが非推奨になり、NSForegroundColorAttributeNameを使用するか、UITextAttributeFontの代わりにNSFontAttributeNameを使用する必要があるという警告を表示します。属性定数を変更した後、AppDelegateからsetTitleTextAttributes:を呼び出すことができます。

11
Dmitry Volkov

IOS-7で行うことは次のとおりです。

UIColor *red = [UIColor colorWithRed:165.0f/255.0f green:1.0f/255.0f blue:0.0f/255.0f alpha:1.0];
UIFont *font = [UIFont fontWithName:@"HelveticaNeue-Light" size:24.0f];

NSMutableDictionary *navBarTextAttributes = [NSMutableDictionary dictionaryWithCapacity:1];
[navBarTextAttributes setObject:font forKey:NSFontAttributeName];
[navBarTextAttributes setObject:red forKey:NSForegroundColorAttributeName ];

self.navBar.titleTextAttributes = navBarTextAttributes;
9
Alex Zavatone

これはSwiftにあります:

let font = UIFont(name: "My_Font", size: 17.0)
UINavigationBar.appearance().titleTextAttributes = [
    NSForegroundColorAttributeName: UIColor.whiteColor(),
    NSFontAttributeName: font!
]

*オプションのUIFontをアンラップする必要があることに注意してください。

8
yndolok

UIBarButonsの場合は、 外観プロキシ を使用します。

 NSDictionary *normalAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                      [UIFont fontWithName:@"Helvetica Neue" size:fontSize], UITextAttributeFont,
                                      nil];
    [[UIBarButtonItem appearance] setTitleTextAttributes:normalAttributes                                                                                                   
                                                forState:UIControlStateNormal];

スタイルが影響するUIBarButtonItemを制限する場合は、代わりにAppearanceWhenContainedIn:を使用します。

UINavigationBarの場合、UILabelを作成し、navigationItem.titleViewに設定できます。

UIabel *title = [[UILabel alloc] initWithFrame:CGRectZero];
title.backgroundColor = [UIColor clearColor];
title.font = [*yourfont*];
title.textColor = [*your color*];
self.navigationItem.titleView = title;
5
Will Jenkins

Swift 4:のナビゲーションバータイトルテキストの色をグローバルに変更する方法は次のとおりです。

UINavigationBar.appearance().titleTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue: UIColor.yellow]
1
Josh Adams