22

アプリのデリゲートで iOS 5 用の次のコードを使用して、UINavigationBar フォントをカスタマイズしようとしていますapplication:didFinishLaunchingWithOptions

if ([[UINavigationBar class] respondsToSelector:@selector(appearance)]) 
{
    [[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: 
                                                          [UIColor whiteColor], UITextAttributeTextColor,
                                                          [UIColor blackColor], UITextAttributeTextShadowColor,
                                                          [NSValue valueWithUIOffset:UIOffsetMake(1, 0)], UITextAttributeTextShadowOffset,
                                                          [UIFont fontWithName:kDefaultFont size:0.0], UITextAttributeFont, 
                                                          nil]];
}

正常に動作し、ナビゲーション バーは私のフォントを使用してレンダリングされます。偉大な。

参考文献フォント サイズ 0 を使用すると、ナビゲーション バーに合わせてフォントのサイズを変更できます (横向きレイアウトの短いナビゲーション バーには、わずかに小さいフォントを使用します)。また、ナビゲーション バーの高さにぴったり合うフォント サイズが選択されます。しかし、縦向きから横向きに移動すると、ナビゲーション バーのタイトル ラベルの幅が台無しになるように見えます。そのため、たとえば「長いタイトルバー」のタイトルとして表示されるものは、最初に表示したときに問題なく表示されます。縦向きでは、横向きで表示すると (適切に小さいフォントで) きれいに見えますが、縦向きに戻すと、フォントは正しく大きいフォントに戻りますが、タイトル テキスト自体が切り詰められて「長い.. ." タイトル全体を表示する十分なスペースがありますが。

明らかに、実際のフォント サイズを指定することはできますが (この場合、この切り捨て動作は見られません)、使用するサイズを手動で判断しています。さらに悪いことに、横向きと縦向きのフォント サイズが同じであるため、現在、短い横向きナビゲーション バーのタイトルに収まるフォント サイズを使用していますが、タイトルは縦長のナビゲーション バーに必要なサイズよりも小さくなっています。

フォント サイズが縦向きと横向きの間で変わるような方法でsetTitleTextAttributesフォントを変更するために使用した経験がある人はいますか? [UINavigationBar appearance]さまざまな厄介な回避策を追求しようとしていますが、この問題に関する経験があればお知らせください。

アップデート:

このバグを Apple に提出する過程で、問題を再現する方法を示すことにしました。

  1. Xcode 4.3.2 で新しい iOS マスター/ディテール アプリケーションを作成します。

  2. 上記のsetTitleTextAttributesコードをアプリ デリゲートに配置しますapplication:didFinishLaunchingWithOptions(フォント @"GillSans" を使用しました)。

  3. MasterViewController に移動し、次の行を追加しますself.title = @"Long Title";

  4. コードをコメントアウトしUIBarButtonItem *addButtonます。

  5. プログラムを実行します。タイトルが「長いタイトル」と正しく表示されていることに注意してください。横向きに回転します。まだ良さそうです。縦向きに戻すと、十分なスペースがあるにもかかわらず、タイトルが「長い...」と表示されます。

  6. 不思議なことに、コードを元に戻すUIBarButtonItem *addButtonと、タイトルは正常に機能します。しかし、UIBarButton アイテムを削除するか、 ではinitWithTitleなくを使用するボタンに置​​き換えるとinitWithBarButtonSystemItem、縦向きから横向きに回転してから縦向きに戻した後に、ナビゲーション バーのタイトルに問題が発生します。

4

5 に答える 5

3

ところで、これが既知の問題であることを認めて、Apple が私のバグ レポートに返信したことを指摘するのを怠っていました。うまくいけば、それはすぐに解決されます!

于 2012-06-05T12:36:49.550 に答える
1

デバイスのローテーション後に Navbar のタイトルを更新するのが良い解決策だと思います。何かのようなもの

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {

        self.navigationItem.title = @"Your title";

}

お役に立てれば!

于 2012-04-14T09:31:42.937 に答える
1

@Abramodj からの応答 (これは機能しません) に基づいて、これを試しました。テキストが実際には変更されていないことをシステムが認識するため、おそらくそのソリューションでは何も起こっていません。何も切り替えずに元に戻すと、それが整理されます。

iOS5.0で動作確認済みです。

// iOS5 has a bug where if you switch orientation the title bar text gets cut off...
-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation     {
    self.navigationItem.title = @"";
    self.navigationItem.title = @"Your Title";
}
于 2012-10-17T10:45:20.367 に答える
1

以下は、この問題に対する私の回避策です。このコードを実装した理由を思い出すために、それぞれの場合に回避策の実装の横に表示されるコメントを次に示します。

// when using an appearance proxy to set a custom font for the navigation bar (generally in
// application:didFinishLaunchingWithOptions: in the appDelegate code) for both iOS 5 & 6,
// there's a glitch that incorrectly auto-truncates the title in the following cirumstances:
//
// 1) when a 0.0 value is used for UITextAttributeFont in the titleTextAttributes dictionary
//    and a device/simulator running pre-iOS 5 rotates back to portrait from landscape
//    solution: perform [self.navigationController.navigationBar setNeedsLayout] in
//              didRotateFromInterfaceOrientation: the view controller in which the
//              auto-truncation is incorrectly occurring for systemVersion < 6.0
//
// 2) when a view initially loads running iOS 6 for a non-0.0 value for the UITextAttributeFont
//    in the titleTextAttributes dictionary
//    solution: perform [self.navigationController.navigationBar setNeedsLayout]
//              in viewDidLoad in the view controller in which the auto truncation is
//              incorrectly occurring for systemVersion >= 6.0

したがって、値 0.0 を使用してUITextAttributeFontも問題ないが、iOS5 のサポートを継続する必要がある場合は、ソリューション (1) を使用します。

#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)
        && UIDevice.currentDevice.systemVersion.floatValue < 6.0)
        [self.navigationController.navigationBar setNeedsLayout];
}
#endif

また、iOS 6 をサポートし、MyAppAppearance クラス メソッドを書き直さなくてもビューが最初に表示されたときにグリッチを修正したいレガシー コードのいくつかのケースでは、 my に 0.0 以外の値を設定し[UINavigationBar appearance] titleTextAttributesました。したがって、ソリューション(2)を実装するには:

- (void)viewDidLoad
{
    [super viewDidLoad];
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0
    if (UIDevice.currentDevice.systemVersion.floatValue >= 6.0)
#endif
        [self.navigationController.navigationBar setNeedsLayout];

    // … other viewDidLoadCode

(そして__IPHONE_OS_VERSION_MIN_REQUIRED括弧は、将来必要に応じて最終的に削除できるコードと、残らなければならない可能性があるコードを思い出させるのに役立ちます。)

ここで、特に回転の場合に何が起こるかをもう少し正確に確認するには、遅いアニメーションを切り替えてシミュレーターを実行します。

于 2012-11-18T08:05:47.773 に答える