5

以前はプロジェクトに画像があり、次のようにロードしていました。

UIImage *image = [[UIImage imageNamed:@"image_name"] resizableImageWithCapInsets:UIEdgeInsetsMake(10.0f, 10.0f, 10.0f, 10.0f)];

次に、その画像を XCode 5 の新しいアセット カタログに入れ、スライスを設定します。resizableImageWithCapInsets画像をロードするときに明示的に呼び出す必要がないように、コードでその画像を使用するにはどうすればよいですか?

別の言い方をすれば、 Images.xcassets に保存されているスライス情報を取得して、UIImagecapInsetsプロパティに保存するにはどうすればよいですか?

それとも、私はこれについてすべて間違っていると考えていますか?

4

2 に答える 2

2

iOS 6/7 と互換性のある私のソリューションは、Xib ファイルでユーザー定義のランタイム属性を使用することです。そのため、xib に設定された画像を、ボタンのキャップ インセットを備えた伸縮可能な画像に置き換えるために、ソース コードのいたるところに洗練されていない行を記述する必要はありません。

ステップ 1: Xib でボタンを選択し、Identity Inspector パネルで User Defined Runtime Attributes を設定します。キャップ インセットを設定するための属性を定義できます。たとえば、ボタンにデフォルトのキャップインセットを使用することを示す単純なブール値を持つ「capEnabled」という属性。(スクリーンショットを添付するつもりでしたが、画像を投稿するには少なくとも10の評判が必要だと言われました... :-( )

ステップ 2: UIButton にカテゴリを作成し、プロパティ「capEnabled」を追加して、ゲッター メソッドとセッター メソッドを実装します。

@interface UIButton (NBAHelper)
@property (nonatomic, assign) BOOL capEnabled;
@end

@implementation UIButton (NBAHelper)

-(BOOL)capEnabled{
    UIImage *buttonBackgroundImage = [self backgroundImageForState:UIControlStateNormal];
    CGFloat capLeft = buttonBackgroundImage ? buttonBackgroundImage.capInsets.left : 0;
    return capLeft>0;
}

-(void)setCapEnabled:(BOOL)capEnabled{
    if (capEnabled) {
        UIImage *buttonBackgroundImage = [self backgroundImageForState:UIControlStateNormal];
        if (buttonBackgroundImage) {
            [self setBackgroundImage:[buttonBackgroundImage stretchableImageWithLeftCapWidth:5 topCapHeight:5] forState:UIControlStateNormal];
        }
    }
}
@end

手順 3: 作成した UIButton の新機能を使用するすべての場所で、カテゴリのヘッダー ファイルをインポートするか、単に .pch ファイルにインポートします。

私の解決策がお役に立てば幸いです。

于 2014-08-09T02:13:22.810 に答える