8

新しいiOS5の外観APIを利用して、アプリ内のすべてのUINavigationBarインスタンスにカスタムの背景画像を提供したいと思います。これを行うには、次のように簡単です。

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"whatever.png"] forBarMetrics:UIBarMetricsDefault];

ただし、インスタンスごとに、translucentプロパティの値に応じて異なる画像を提供したいと思います。

// For UINavigationBar instances where translucent returns YES:
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"whatever-translucent.png"] forBarMetrics:UIBarMetricsDefault];

// Otherwise:

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"whatever.png"] forBarMetrics:UIBarMetricsDefault];

外観APIはクラスメソッドを使用して構成されているように見えるので、このようなことは可能ですか?

4

6 に答える 6

4

クラス外観プロキシを使用してグローバルに設定するか、navBarのインスタンスに設定することができます。

現在、ナビゲーションバーのインスタンスに背景を設定していますが、機能しているようです。背景が異なる2つの異なるnavBarがあります。インスタンスに設定すると、コードを調整できるはずです。

UINavigationController *myNavController = [[UINavigationController alloc] initWithRootViewController:myView];
[viewControllers addObject:myNavController];

// not supported on iOS4
UINavigationBar *navBar = [myNavController navigationBar];
if ([navBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)])
{
    // right here, you could condition bg image based on properties of this instance
    // of the navBar or any other condition.

    [navBar setBackgroundImage:[UIImage imageNamed:@"bg.jpg"] forBarMetrics:UIBarMetricsDefault];
}

クラスメソッドを使用して設定する場合は、すべてに設定できます。

[[UINavigationBar appearance] setBackground ...

私はそれがかなり新しいことを認めます、そして私はほとんどの人々のようにそれを理解しているだけです。

于 2011-10-13T23:36:06.930 に答える
4

現時点では、あなたが説明していることを行う方法はありません-外観プロキシは、あなたがそれを要求しているときに特定のインスタンスについて何も知りません。

実際には、おそらくあなたがする必要があるのは、あなたが持っているであろう半透明のバーの数とあなたが持っていた非半透明のバーの数を把握することです。どちらかを選択し、その1つに外観プロキシを使用します。他の場合は、半透明にする(またはフルスクリーンレイアウトを要求する)場合は、背景画像を設定する必要があります。

それまでの間、 http://bugreport.apple.com/で拡張リクエストを提出して、質問内容を確認してください。それは不合理な要求ではありません。ありがとう!

于 2011-10-14T00:15:12.640 に答える
1

この答えはおそらくあなたにはあまり役に立たないでしょうが、他の人には役立つかもしれません。サブクラスを作成する場合は、各サブクラスの外観を個別に指定できます。たとえば、UITableviewCellsとUITableViewCellsから派生したカスタムクラスがあります。私は実際にこれを行うのには理由がありますが、両方のクラスに対して[[UITableViewCellsappearance] setFont:[...]]を呼び出す必要があることがわかりました。

実行時までわからない変数に基づいてそうしたいと思うように思われるので、おそらく運が悪いです!

于 2012-05-08T15:18:53.393 に答える
1

どのクラスに半透明のバーが含まれているかがわかっている場合は、次のように実行できます。

[[UIBarButtonItem appearanceWhenContainedIn:[MyClassWithTranslucentBar class], [MyOtherClassWithTranslucentBar class], nil]
    setTintColor:desiredColor];
于 2012-11-27T15:35:15.680 に答える
0

私はコメントを残すことができないので、答えでなければなりません。RobWhitlowはこれについて素晴らしい記事を書きました。それをチェックしてください:http://ios-blog.co.uk/tutorials/ios-custom-ui-series-tabbar-navbar/

于 2013-12-27T11:16:28.803 に答える
0

これを試して:

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {


        // Load resources for iOS 6.1 or earlier

         navigationController1 = [self customizedNavigationController];
         [navigationController1 setViewControllers:[NSArray arrayWithObject: self.homeViewController]];

         [self setNavigationController:navigationController1];
         [self.window setRootViewController:navigationController];


    } else {
        // Load resources for iOS 7 or later
         navigationController1 = [[UINavigationController alloc] initWithRootViewController:self.homeViewController];
          [self.window setRootViewController:navigationController1];
    }


  - (UINavigationController *)customizedNavigationController {

     UINavigationController *navController = [[UINavigationController alloc]   initWithNibName:nil bundle:nil];

    // Ensure the UINavigationBar is created so that it can be archived. If we do not access the
    // navigation bar then it will not be allocated, and thus, it will not be archived by the
    // NSKeyedArchvier.
    [navController navigationBar];

    // Archive the navigation controller.
    NSMutableData *data = [NSMutableData data];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [archiver encodeObject:navController forKey:@"root"];
    [archiver finishEncoding];

    // Unarchive the navigation controller and ensure that our UINavigationBar subclass is used.
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    [unarchiver setClass:[LNTNavigationBar class] forClassName:@"UINavigationBar"];
    UINavigationController *customizedNavController = [unarchiver decodeObjectForKey:@"root"];
    [unarchiver finishDecoding];

    // Modify the navigation bar to have a background image.
    LNTNavigationBar *navBar = (LNTNavigationBar *)[customizedNavController navigationBar];
    [navBar setTintColor:[UIColor colorWithRed:0.39 green:0.72 blue:0.62 alpha:1.0]];
    [navBar setBackgroundImage:[UIImage imageNamed:@"nav_bar_1024_46.png"] forBarMetrics:UIBarMetricsDefault];
    [navBar setBackgroundImage:[UIImage imageNamed:@"nav_bar_1024_46.png"] forBarMetrics:UIBarMetricsLandscapePhone];

    return customizedNavController;
}
于 2013-12-27T12:20:27.050 に答える