iphone - UIGraphicsBeginImageContextWithOptions 中的 CGContextDrawImage 忽略了 UIEdgeInsets

标签 iphone ios ios5 core-graphics

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

在 UIImage 上直接使用 resizableImageWithCapInsets: setImage: into a button 对我来说效果很好:

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

如下图(左边是原始缩放,右边是用插图缩放):

Image stretched without ado Image stretched with decent insets

所以右边的很好 - 顶部/底部/左侧/右侧的线间距相等。到目前为止一切顺利。

现在,如果我尝试对绘制的图像进行完全相同的操作,然后使用以下命令捕获到屏幕外缓冲区:

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

我在下面(同样左边是原始缩放,右边是带有插图):

raw scaling, side buffer scaling with inset, side buffer (WRONG!) .

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

有人对这里出了什么问题有任何建议吗?功能齐全的示例位于 http://people.apache.org/~dirkx/insetSample.zip以及位于 http://pastebin.com/rm8h6YFV 的关键代码.

感谢任何和所有建议。

Dw

最佳答案

我猜测可伸缩 UIImages 的处理级别高于 Quartz2D,因此使用 CGContextDrawImage 将无法正常工作。

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

相关行是:

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

关于iphone - UIGraphicsBeginImageContextWithOptions 中的 CGContextDrawImage 忽略了 UIEdgeInsets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12562742/

相关文章:

iphone - 如何在 iPhone 中保存 plist 文件中的值?

iphone - 如何在 iphone sdk 中上传/下载 skyDrive 上的文件夹

iphone - 非 PIE 二进制文件 - 可执行文件 'project name' 不是位置无关的可执行文件。

iphone - 断字库不适用于 iOS 5

ios - 如何在继续之前等待功能完成

objective-c - XCode 4.5 UiScrollView 问题

objective-c - "enhanced"iOS 表格单元格的入门?

iOS 从导航 Controller 子类设置工具栏项

jquery - 滚动后,在错误的区域检测到触摸(iPad/网站)

c++ - 如何使用 Xcode 在 C++ 库中使用 __IPHONE_4_0 定义?