2011-12-29 5 views
25

resizableImageWithCapInsetsを使用する場合:UIButtonの画像を通常の状態(setBackgroundImage:forState: )が動作します。他のすべての状態では、描画されたイメージの代わりにギャップが表示されます。 UIButtonは、特定の状態にイメージが設定されていない場合、通常の状態のイメージは、無効な状態と選択された状態のオーバーレイと共に使用されることを示します。ここresizableImageWithCapInsetsを使用:ボタンの画像は状態セットでのみ機能し、他の状態は「ギャップ」を表示します

通常の状態である。

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]; 
+0

コードスニペットを追加し、スクリーンショットをホストしました(当然のことながら該当領域に切り取られました) – NSProgrammer

+0

これは奇妙です...私は好きです可能ならばbutton.pngを見てください。 –

+0

http://i40.tinypic.com/ea35zq.png - 私は新しいユーザーとして2つのリンクを投稿に追加することができますが、ここにはsourece button.png – NSProgrammer

答えて

34

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

現在のコードでは、画像の高さと幅の半分の帽子を作成しています。これにより、「伸縮性のある」領域が0x0ピクセルになります。

ボタンの通常の状態でこれが間違って表示されないのは分かりません。おそらく、あなたが伸縮可能なものを供給しないと、UButtonに組み込まれていたり、これは他の状態には適用されません。

キャップは、伸ばしてはいけない画像の領域を定義するものとします。 button.png画像の場合、これは左右に6ピクセル、上下から16ピクセルです。これはあまり標準的ではありませんが、あなたはグラフィックデザイナーに(少なくとも普通のストレッチである左右の場合は)中央に1ピクセルの領域しか持たないようにしてください。しかし、これは結果には影響しません。 1pxの伸縮可能な領域を持っている場合は、あなたの質問でしようとしたように画像サイズからキャップを派生させてコードを標準化することができます(各キャップは上/下の場合は(image.size.height - 1)/2、 )。あまりにもiOS5を上のサイズ変更可能な画像を使用している間、私は問題を経験していた

UIEdgeInsets insets = UIEdgeInsetsMake(16, 6, 16, 6); 
image = [image resizableImageWithCapInsets:insets]; 
+0

+1のロジックが間違いなくそのことを説明しています。エッジ値を切り捨てます。 'truncf((image.size.height - 1)/ 2.0)'イメージのサイズが正しく調整されました。 Kudos to jrturton – NSProgrammer

+1

大きなキャッチですが、iOS6は、2つのインセットが出会うピクセルを繰り返して、iOS 5のバグのように見えることに注意してください。 – tapi

0

は、ボタンに正しい画像を取得するには、伸縮性の画像を作成するための次のコードを使用します。ボタンのタイプが「RountedRect」で、背景イメージを操作すると、サイズ変更可能なイメージは期待どおりに動作しません。

+0

説明されている問題は、「カスタム」ボタンスタイルにありました。 – NSProgrammer

関連する問題