2

我有奇怪的错误(?)

如果我从 UIApplicationDelegate application:didFinishLaunchingWithOptions: 调用 setBackgroundImage:forToolbarPosition:barMetrics: ,它工作正常并且工具栏背景更改为我的图像。

如果我尝试将此调用设置到另一个地方,例如 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];
}
4

3 回答 3

3

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

于 2012-12-10T09:33:05.490 回答
2

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

请记住,iOS 原生控制器在图层绘制方面非常高效,因此它只会在绘制控制器视图时更新根视图控制器的框架(或实际需要更新的最低限度);如果我没有弄错,即使设置导航控制器的标题也会成功(但按下按钮或更改它们不会产生任何影响,原因与仅更新按钮层相同)。

在这种情况下,在创建代理后调用 [myToolbarInstance setNeedDisplay]。通过这种方式,您可以随时更改任何控制器的外观,甚至可以利用它节省一些重绘调用。

于 2012-12-14T12:11:04.697 回答
0

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

于 2012-12-07T14:05:59.200 回答