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 が呼び出されていることは確かですか? (たとえば、UIViewControllerではなくUIViewにはありません)

于 2012-12-07T14:05:59.200 に答える