setBackgroundImage:forToolbarPosition:barMetrics:不是从AppDelegate调用

时间:2012-12-04 11:36:02

标签: iphone image background toolbar

我有奇怪的错误(?)

如果我调用setBackgroundImage:forToolbarPosition:barMetrics:来自UIApplicationDelegate应用程序:didFinishLaunchingWithOptions :,它工作正常,工具栏背景更改为我的图像。

如果我尝试将此调用设置为其他位置,例如viewDidLoad,则无效。

代码很简单, 此代码有效:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[UIToolbar appearance] setBackgroundImage:[UIImage imageNamed:@"bg"] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];
    return YES;
}

而这不是:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[UIToolbar appearance] setBackgroundImage:[UIImage imageNamed:@"bg"] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];
}

3 个答案:

答案 0 :(得分:3)

您必须在实例化项目之前设置外观代理值。如果您的工具栏已经从XIB实例化,则viewDidLoad可能为时已晚。

答案 1 :(得分:2)

一旦调用该方法,系统将为应用程序中的所有UIToolBars获取新的外观代理,但您需要调用[navitagtionController.view setNeedsDisplay];所以绘制了控制器的图层,特别是如果你在导航控制器的根控制器的viewDidLoad中调用它。

请记住,iOS本机控制器在图层绘制中非常有效,因此它只会在控制器视图绘制时更新根视图控制器的框架(或者实际更新所需的最小值);如果我没有错误甚至设置导航控制器的标题将成为技巧(但按下按钮或更改它们不会有任何影响,原因相同,只有按钮层已更新)。

在这种情况下,在创建代理后调用[myToolbarInstance setNeedDisplay]。这样您就可以随时更改任何控制器的外观,甚至可以利用它来保存一些重绘调用。

答案 2 :(得分:0)

您确定正在调用viewDidLoad吗? (例如,它不在UIView而不是UIViewController中)