4

画面外のバッファに描画するときに、イメージインセットを機能させるのに苦労しています。

UIImageでresizableImageWithCapInsets:を直接setImage:ボタンに使用すると、次のように機能します。

UIImage * base = [UIImage imageNamed:@"button.png"];
UIImage * img = [base resizableImageWithCapInsets:UIEdgeInsetsMake(20,20,20,20)];
[self setImage:img forState:UIControlStateNormal];

以下に示すように(左は生のスケーリング、右はインセットでスケーリングされます):

苦労せずに引き伸ばされた画像 きちんとしたはめ込みで引き伸ばされた画像

したがって、右側の行は問題ありません。上/ボタン/左/右の線は等間隔に配置されています。ここまでは順調ですね。

ここで、描画されてからオフスクリーンバッファにキャプチャされた画像でまったく同じことを試してみると、次のようになります。

UIImage * base = [UIImage imageNamed:@"button.png"];
base = [base resizableImageWithCapInsets:UIEdgeInsetsMake(20,20,20,20)];

UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0);
ctx = UIGraphicsGetCurrentContext();

CGContextDrawImage(ctx, CGRectMake(0,0,self.bounds.size.width,
         self.bounds.size.height), [base CGImage]);

img = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext(); 
[self setImage:img forState:UIControlStateNormal];

私は以下になります(ここでも左は生のスケーリング、右ははめ込みです):

生のスケーリング、サイドバッファーインセット、サイドバッファによるスケーリング(間違っています!)

したがって、ここでは挿入図が無視されているようです。

ここで何がうまくいかないかについての提案はありますか?完全に機能する例はhttp://people.apache.org/~dirkx/insetSample.zipにあり、キーコードはhttp://pastebin.com/rm8h6YFVにあります。

ありとあらゆる提案に感謝します。

Dw

4

1 に答える 1

13

ストレッチ可能なUIImageはQuartz2Dよりも高いレベルで処理されるため、使用CGContextDrawImageは機能しないと思います。

-[UIImage drawInRect]代わりに使用してみてください。これにより、現在のUIGraphicsコンテキストが描画されます。これは、コードスニペットで作成するビットマップコンテキストです。

関連する行は次のとおりです。

[base drawInRect:CGRectMake(0,0,self.bounds.size.width,
                                    self.bounds.size.height)];
于 2012-09-24T10:44:58.127 に答える