web-dev-qa-db-ja.com

resizableImageWithCapInsetsの使用:ボタンの画像は状態セットでのみ機能し、他の状態は「ギャップ」を示します

ResizableImageWithCapInsets:を使用してUIButtonの画像を作成する場合、通常の状態(setBackgroundImage:forState:を使用して画像を設定する状態)のみが機能します。他のすべての状態では、描画された画像の代わりにギャップが表示されます。 UIButtonは、特定の状態に画像が設定されていない場合、通常の状態の画像が無効および選択された状態のオーバーレイとともに使用されることを示しています。

これが通常の状態です。

enter image description here

選択された状態は次のとおりです。

enter image description here

そして、これがソース画像です:

enter image description here

それは明らかに私が提供したサイズ変更可能な画像を使用していますが、画像はサイズ変更された領域を描画していません。 (左と右のエッジは表示されますが、引き伸ばされる中央の領域は描画されません)。

興味深いことに、stretchableImageWithLeftCapWidth:topCapHeight:は機能します。現在、これはiOS 5で非推奨のメソッドですが、新しいAPIにギャップが示されているため、それを使用して立ち往生している場合があります。

私は、各州により多くの画像を提供できることを認識していますが、それは、メモリフットプリントを削減するという私が達成しようとしている目的に反し、グラフィックデザイナーへの依存を追加して避けたいです。

// This is the Gist of the code being used
UIImage* image = [UIImage imageNamed:@"button.png"];
UIEdgeInsets insets = UIEdgeInsetsMake(image.size.height/2, image.size.width/2, image.size.height/2, image.size.width/2);
image = [image resizableImageWithCapInsets:insets];
[self.button setBackgroundImage:image forState:UIControlStateNormal];
// Even doing the following results in the same behaviour
[self.button setBackgroundImage:image forState:UIControlStateSelected];
25
NSProgrammer

画像のキャッピングのためにインセットを適切に作成していません。問題を再現し、正しいインセットを使用して修正しました。

現在のコードでは、画像の高さと幅の半分のキャップを作成しています。これにより、0x0ピクセルの「伸縮可能な」領域が残るため、中央に何も表示されません。

なぜこれがボタンの通常の状態で間違って表示されないのかわかりません-おそらく、UIButtonにいくつかの最適化が組み込まれていて、物事を修正したり、伸縮可能な画像を提供しない場合は自動補正したりします。他の州には適用されません。

キャップは、引き伸ばしてはならない画像の領域を定義することになっています。 button.png画像の場合、これは左右6ピクセル、上下16ピクセルです。これは標準ではありません。グラフィックスデザイナーに(少なくとも最も一般的なストレッチである左から右へ)中央に1pxの領域のみを配置するように指示する必要がありますが、これは結果には影響しません。 1pxの伸縮可能な領域がある場合は、質問で行ったように画像サイズからキャップを導出することでコードを標準化できます(各キャップは(image.size.height - 1) / 2上/下の場合は同じですが、幅は左/右の場合です)。

ボタンの正しい画像を取得するには、次のコードを使用して伸縮可能な画像を作成します。

UIEdgeInsets insets = UIEdgeInsetsMake(16, 6, 16, 6);
image = [image resizableImageWithCapInsets:insets];
34
jrturton

IOS5でもサイズ変更可能な画像を使用中に問題が発生しました。ボタンのタイプが「RountedRect」であり、背景画像を操作すると、サイズ変更可能な画像が期待どおりに動作しないことがわかります。 (iOS6は、おそらく新しいボタンタイプを想定し、必要に応じて調整することで、この問題を処理します。)

0
MikecheckDev