8

我想利用新的 iOS 5 外观 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

目前,无法执行您所描述的操作 - 外观代理在您调用它时对任何特定实例一无所知。

实际上,您可能需要做的是弄清楚您有多少半透明条与您有多少非半透明条。选择您拥有的更多并为其使用外观代理 - 对于其他人,当您使其半透明(或要求全屏布局)时,您必须设置背景图像。

同时,您能否针对您的要求在http://bugreport.apple.com/提交增强请求?这不是一个不合理的要求。谢谢!

于 2011-10-14T00:15:12.640 回答
4

您可以使用类外观代理对其进行全局设置,也可以将其设置在导航栏的实例上。

我目前正在导航栏的一个实例上设置背景,它似乎正在工作。我有两个不同背景的不同导航栏。如果您在实例上设置它,您应该能够调节代码。

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 回答
1

这个答案可能对您没有太大帮助,但可能对其他人有帮助。如果您创建一个子类,您可以分别指定每个子类的外观。例如,我有 UITableviewCells 和一个从 UITableViewCells 派生的自定义类。实际上我这样做是有原因的,但我发现我需要专门为这两个类调用 [[UITableViewCells appearance] setFont:[...]] 。

由于您似乎希望基于一个直到运行时才知道的变量来执行此操作,所以您可能不走运!

于 2012-05-08T15:18:53.393 回答
1

如果您知道哪些类包含半透明条,您可以这样做:

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

我不能发表评论,所以必须回答。Rob Whitlow 就此写了一篇很棒的文章。看看: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 回答