問題: Appearance Proxyを使用して設定すると、UIBarButtonItem 背景画像のスケーリングが resizableImageWithCapInsets に従って行われない
私が達成しようとしていることのために、いくつかのテスト資産を含むプロジェクトをセットアップしました。背景画像と、UIBarButtonItem の 2 つのアイコン画像があります。彼らです:
背景 (50x34):
アイコン (30x30):
これらのアイコンは @2x バージョン (したがって、上記のサイズの 2 倍) ですが、プロジェクトには標準のアセットも含まれているので安心してください (半分のサイズ)。
クリエイティブですね!しかし、ここに問題があります。アイコンが背景画像の緑色の部分だけを拡大縮小するように、ボタンの背景画像に追加のパディングが必要です。AppDelegate にあるコードは次のとおりです。
UIImage *bgImage = [[UIImage imageNamed:@"testbutton2"] resizableImageWithCapInsets:UIEdgeInsetsMake(16, 20, 16, 20)];
[[UIBarButtonItem appearance] setBackgroundImage:bgImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
これはすべてうまく機能し、UIBarButtonItem の最初のインスタンスに適しています。ただし、後続のインスタンスごとに、画像のサイズ変更可能な部分は完全に無視されます。見てみな:
ご覧のとおり、画面 1 ではすべてが計画どおりに進んでいます。ただし、UIBarButtonItem の後続の使用はすべて正しくスケーリングされません。
さて、私はこの問題を解決することができました。UIBarButtonItem のすべてのインスタンスで外観を設定する必要がありました。これを行うには、すべてのビュー コントローラーが継承する共通の UIViewController スーパークラスを用意しました。その中に、次のコードがありました。
- (void)viewDidLoad
{
[super viewDidLoad];
UIImage *bgImage = [[UIImage imageNamed:@"testbutton2"] resizableImageWithCapInsets:UIEdgeInsetsMake(16, 20, 16, 20)];
[self.navigationItem.rightBarButtonItem setBackgroundImage:bgImage
forState:UIControlStateNormal
barMetrics:UIBarMetricsDefault];
[self.navigationItem.leftBarButtonItem setBackgroundImage:bgImage
forState:UIControlStateNormal
barMetrics:UIBarMetricsDefault];
}
これにより、次の結果が得られます。
したがって、問題の解決策を見つけたと思いますが、元の実装が機能しなかった理由について少し当惑しています。オブジェクトの個々のインスタンスの外観を変更する必要がないように、外観プロキシを使用することを意図しているように思えます。まさに私がやらなければならなかったことです。ここで何が起こっているのか誰か説明してくれませんか? これはバグですか、それとも何か間違っていますか?