7

iOSでは、UIImageはstretchableImageWithLeftCapWidthをサポートしていますか?、それはuimmageの自動サイズ変更を意味しますか?

4

2 に答える 2

22

まず、これは非推奨になり、より強力なに置き換えられましたresizableImageWithCapInsets:。ただし、これはiOS5.0以降でのみサポートされています。

stretchableImageWithLeftCapWidth:topCapHeight:呼び出した画像のサイズは変更されません。新しいUIImageを返します。すべてのUIImageはさまざまなサイズで描画できますが、キャップされた画像は、コーナーにキャップを描画し、残りのスペースを埋めることでサイズ変更に対応します。

これはいつ役に立ちますか?iOS 5バージョンのこのチュートリアルのように、画像からボタンを作成する場合。

次のコードは、通常の画像とキャップ付きの伸縮可能な画像drawRectの違いを示すUIViewメソッドです。UIImageに使用された画像はhttp://commons.wikimedia.org/wiki/Main_Pagestretch.pngからのものです。

- (void) drawRect:(CGRect)rect;
{
    CGRect bounds = self.bounds;

    UIImage *sourceImage = [UIImage imageNamed:@"stretch.png"];
    // Cap sizes should be carefully chosen for an appropriate part of the image.
    UIImage *cappedImage = [sourceImage stretchableImageWithLeftCapWidth:64 topCapHeight:71];

    CGRect leftHalf = CGRectMake(bounds.origin.x, bounds.origin.y, bounds.size.width/2, bounds.size.height);
    CGRect rightHalf = CGRectMake(bounds.origin.x+bounds.size.width/2, bounds.origin.y, bounds.size.width/2, bounds.size.height);
    [sourceImage drawInRect:leftHalf];
    [cappedImage drawInRect:rightHalf];

    UIFont *font = [UIFont systemFontOfSize:[UIFont systemFontSize]];
    [@"Stretching a standard UIImage" drawInRect:leftHalf withFont:font];
    [@"Stretching a capped UIImage" drawInRect:rightHalf withFont:font];
}

出力:

ウィキメディアコモンズのロゴは、キャップの有無にかかわらず引き伸ばされています

于 2012-04-14T02:41:52.050 に答える
13

互換性を維持するためのカテゴリメソッドを作成しました

- (UIImage *) resizableImageWithSize:(CGSize)size
{
    if( [self respondsToSelector:@selector(resizableImageWithCapInsets:)] )
    {
        return [self resizableImageWithCapInsets:UIEdgeInsetsMake(size.height, size.width, size.height, size.width)];
    } else {
        return [self stretchableImageWithLeftCapWidth:size.width topCapHeight:size.height];
    }
}

すでに持っている(または新しいものを作成する)UIImageカテゴリに入れるだけで、これは古い方法のストレッチ可能なサイズ変更のみをサポートします。より複雑なストレッチ可能な画像のサイズ変更が必要な場合は、iOS5でresizableImageWithCapInsetsを使用してのみ行うことができます。

于 2012-07-03T13:05:37.900 に答える