【问题标题】:UIEdgeInsets ignored on CGContextDrawImage within a UIGraphicsBeginImageContextWithOptionsUIGraphicsBeginImageContextWithOptions 中的 CGContextDrawImage 上的 UIEdgeInsets 被忽略
【发布时间】:2012-09-15 18:39:52
【问题描述】:

当绘制到屏幕外缓冲区时,我正在努力让 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 上的关键代码。

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

Dw

【问题讨论】:

    标签: iphone ios ios5 core-graphics


    【解决方案1】:

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

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

    相关行是:

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

    【讨论】:

    • 我刚刚尝试编辑您提供的项目并进行此更改解决了您的问题。
    • 谢谢 - 这确实是正确的。与该更改相得益彰(供将来参考 - pastebin.com/FjZkfb9z 是更新的文件/代码。
    • 实际上 - 使用真实图像执行此操作时(在视觉混合器 (flickr.com/photos/peterprice/121342192) 上看到的有点像照明按钮) - 需要确保物体旋转 - 作为两个绘图层Y 原点位于顶部和底部。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多