4

在绘制到屏幕外缓冲区时,我正在努力让 Image Insets 工作。

使用 resizableImageWithCapInsets: 在 UIImage 上直接 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上的关键代码。

任何和所有建议表示赞赏。

4

1 回答 1

13

我猜想可拉伸 UIImages 的处理级别比 Quartz2D 更高,因此使用CGContextDrawImage是行不通的。

您可以尝试-[UIImage drawInRect]改用。这将绘制到当前 UIGraphics 上下文,这是您在代码片段中创建的位图上下文。

相关线路是:

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