我有奇怪的错误(?)
如果我调用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];
}
答案 0 :(得分:3)
您必须在实例化项目之前设置外观代理值。如果您的工具栏已经从XIB实例化,则viewDidLoad可能为时已晚。
答案 1 :(得分:2)
一旦调用该方法,系统将为应用程序中的所有UIToolBars获取新的外观代理,但您需要调用[navitagtionController.view setNeedsDisplay];所以绘制了控制器的图层,特别是如果你在导航控制器的根控制器的viewDidLoad中调用它。
请记住,iOS本机控制器在图层绘制中非常有效,因此它只会在控制器视图绘制时更新根视图控制器的框架(或者实际更新所需的最小值);如果我没有错误甚至设置导航控制器的标题将成为技巧(但按下按钮或更改它们不会有任何影响,原因相同,只有按钮层已更新)。
在这种情况下,在创建代理后调用[myToolbarInstance setNeedDisplay]。这样您就可以随时更改任何控制器的外观,甚至可以利用它来保存一些重绘调用。
答案 2 :(得分:0)
您确定正在调用viewDidLoad吗? (例如,它不在UIView而不是UIViewController中)