2012-04-25 6 views
13

私は、iOS 5.0以降のプラットフォームを対象とした最初のiOSアプリケーションを作成しています。私はアプリケーションのUIをカスタマイズするためにUIAppearanceプロトコルを使用しています。UIImage resizableImageWithCapInsets:期待どおりに動作しない

UIBarButtonItemの背景をアプリケーション全体で変更しようとしています。私のUIBarButtonItemのサイズがテキストやアイコンに応じて変更される可能性があるので、私はUIImage resizableImageWithCapInsets:を自分の背景pngと利用しようとしています。

私が最初に必要としたコードはRay Wenderlichです。前述のチュートリアルで使用されている画像に非常に近い画像で、同じ正確なコードを使用すると、私は奇妙な結果を得ています。ココアタッチの経験がないだけかもしれません。

ここに私が使用しているコードがあります。

DreamsAppDelegate.m - customizeAppearance:

UIImage *btnBg = [[UIImage imageNamed:@"navBarButton-bg"] 
      resizableImageWithCapInsets:UIEdgeInsetsMake(0, 6, 0, 6)]; 

[[UIBarButtonItem appearance] setBackgroundImage:btnBg 
             forState:UIControlStateNormal 
             barMetrics:UIBarMetricsDefault]; 

ここで私は

png background

とここを使用しようとしているPNGの背景画像は(シミュレータで)結果です

result of trying to use resizableImageWithCapInsets:

答えて

19

leftrightの間、およびtopbottomの間のセクションは、画像に必要なスペースを埋めるように並べられています。試してくださいUIEdgeInsetsMake(15, 6, 15, 6)

一般化するには、イメージに連続グラジエントがある場合、繰り返しセクションは1ピクセル高くなければなりません。ボタン画像の高さが31ピクセルなので、topbottom(最初と3番目の引数はUIEdgeInsetsMake)は30になるはずです。 UIEdgeInsetsMake(8, 6, 22, 6)は、繰り返しセクションを上に移動し、背景がより薄くなります。

また、プレーンまたは網膜( '@ 2x')バージョンの画像を添付したファイルはありますか?インセットはプレーン版のサイズに収まる必要があります。

+0

ありがとう:

だから、このコードを使用します。投稿された画像は@ 2xです。だから私は測定値を(0,3,0,3)に減らすべきですか?画像の中央を1ピクセル幅にする必要があると言っていますか?私はその理由を理解していますが、その後のチュートリアルでは、30px x 40pxのイメージがあり、自分と同じスタイルのグラデーションを使用しています。これは素晴らしい機能です(UIEdgeInsetsMakeを使用しています。私の角の半径のために)。 –

+0

これはトリックです:上と下には0を使用できます_背景画像はナビゲーションバーボタンと同じ高さです。その空間を既存のグラデーションで塗りつぶすだけです。あなたの画像は網膜のナビゲーションボタンの高さではありませんので、その高さを埋めるために伸ばしたり、繰り返したりします。トップとボトムのキャップサイズ(1番目と3番目の引数)を指定する必要があります。 '(7、3、7、3)'で始まります。これはいくつかのストライピングを残しますが、うまくいけば何が起こっているのか明確な考えを与えるでしょう。 – Dondragmer

+0

ああ、もう少し意味があります。網膜のNavBarボタンのサイズは?私は網膜サイズのPSDファイルから自分のUI要素をスライスしているので、もしpsdファイル上でnavBarボタンbgを大きくして、必要なものを得るためにエクスポートする必要があれば、それは簡単になります。 –

17

私はまったく同じ問題を抱えています。

もう1つのことは、UIImageResizingModeStretchのresizingModeを設定することです。それは私の問題を解決しました。

ところで、IOS5では利用できません。だから、私の解決策は誰もが言ったようにすることです。タイル可能な面はちょうど1ピクセルでなければならないことを理解してください。ほとんどのボタンは、とにかく途中であまり変化しません。あなたの応答を

-(UIImage *) resizableImageWithCapInsets2: (UIEdgeInsets) inset 
    { 
     if ([self respondsToSelector:@selector(resizableImageWithCapInsets:resizingMode:)]) 
     { 
      return [self resizableImageWithCapInsets:inset resizingMode:UIImageResizingModeStretch]; 
     } 
     else 
     { 
      float left = (self.size.width-2)/2;//The middle points rarely vary anyway 
      float top = (self.size.height-2)/2; 
      return [self stretchableImageWithLeftCapWidth:left topCapHeight:top]; 
     } 
    } 
+3

古い投稿でも、これに答える時間をとってくれてありがとう。とても有難い! –

+1

他の答えは実際に問題を解決するものではありません。ありがとう。 –

+1

ありがとう!私のためにうまくいった。 –

関連する問題