13

iOS5.0以降のプラットフォームをターゲットにした最初のiOSアプリを作成しています。このプロトコルを使用してUIAppearance、アプリケーションのUIをカスタマイズしています。

UIBarButtonItemアプリケーション全体の背景を変更しようとしています。使用するテキストやアイコンによってサイズが変わる場合があるため、背景pngでUIBarButtonItem利用しようとしています。UIImage resizableImageWithCapInsets:

私はもともと、必要なコードをRayWenderlichで見つけました。前述のチュートリアルで使用したものにかなり近い画像で、まったく同じコードを使用すると、奇妙な結果が得られます。多分それはCocoaTouchの私の経験不足です。

これが私が使用しているコードです。

DreamsAppDelegate.m-customizeAppearance:

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

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

これが私が使おうとしているpng背景画像です

png背景

そしてここに結果があります(シミュレーターで)

resizableImageWithCapInsetsを使用しようとした結果:

4

2 に答える 2

19

との間、leftおよびとの間の画像のセクションは、画像に必要なスペースを埋めるために並べて表示されます。試してみてください。righttopbottomUIEdgeInsetsMake(15, 6, 15, 6)

一般化すると、画像に連続的なグラデーションがある場合、繰り返されるセクションの高さは1ピクセルのみにする必要があります。ボタンの画像の高さは31ピクセルなので、topand bottom(の最初と3番目の引数UIEdgeInsetsMake)は30に追加する必要があります。同じである必要はありません。UIEdgeInsetsMake(8, 6, 22, 6)繰り返されるセクションが上に移動し、背景が薄くなります。

また、添付したファイルは、画像のプレーンバージョンですか、それとも網膜('@ 2x')バージョンですか?挿入図は、プレーンバージョンのサイズ内である必要があります。

于 2012-04-25T03:58:50.267 に答える
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];
        }
    }
于 2012-10-17T14:14:25.077 に答える