在UIGraphicsBeginImageContextWithOptions中的CGContextDrawImage上忽略了UIEdgeInsets

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

在UIImage上直接使用resizableImageWithCapInsets:setImage:进入一个按钮对我来说很好:

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

如下所示(左边是原始缩放,右边是使用insets缩放):

图像拉伸没有ado图像延伸有适当的插图

所以正确的一个很好 – 线条顶部/底部/左/右是相等的间隔。 到现在为止还挺好。

现在,如果我使用绘制的图像尝试相同的事情,然后将其捕获到屏幕外缓冲区,其中:

 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]; 

我得到了下面(再次左边是原始缩放,右边是插图):

原始缩放,边缓冲使用inset,side buffer进行缩放(错误!)

所以这里似乎忽略了插图。

有人对这里出了什么问题有任何建议吗? http://mans.apache.org/~dirkx/insetSample.zip上的完整function示例以及http://pastebin.com/rm8h6YFV上的密钥代码。

任何和所有建议赞赏。

DW

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

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

相关的是:

 [base drawInRect:CGRectMake(0,0,self.bounds.size.width, self.bounds.size.height)];