关于第二层位图的问题,其中一个是半透明的。
我有一个名为foo的自定义UIView。我有两个我创建的CGBitmapContext。它们实际上被用作屏幕外缓冲器并且具有相等的矩形尺寸。我想把它们中的两个放在屏幕上,然后将它们分层放在另一个上面。背景应该是半透明的,前景应该是不透明的(但是使用clearColor以便通过背景显示)。结果是你有一个清晰的前景,可以看到未绘制前景的背景图像(clearColor)。
CGContextRef background;
CGContextRef foreground;
我正在尝试在两个CGBitmapContext所在的自定义UIView foo中实现它。我有一个带有子视图(前景)的父视图(背景),我试图在(void)drawRect:(CGRect)rect覆盖中实现它。我已经尝试过反复思考这个问题,但我通常只能得到其中一个视图/位图来显示。
问题1:这是正确的方法吗?我应该尝试使用图层吗?我应该将位图和BLT组合到父/根UIView吗? 问题2:为完成上述任务而提供的任何示例代码均值得赞赏!
谢谢!
答案 0 :(得分:0)
更新:
我必须这样做是非常荒谬的,因为必须有一个更简单的方法,但我最终将两个独立的UIViews放在另一个上,然后相应地设置不透明度和alpha。这很有效。
我正在尝试编写一个新视图,这样做正确的方式看起来像:
UIView : myview
- (subview) UIImageView
- (subview) UIImageView
The code looks something like this...
@interface customView : UIView
{
...
UIImageView *foregroundImage;
UIImageView *backgroundImage;
...
}
@end
@implementation
- (void) awakeFromNib
{
...
self.backgroundColor = [UIColor whiteColor];
self.alpha = 1;
self.opaque = YES;
self.clearsContextBeforeDrawing = FALSE;
[backgroundImage initWithImage:<...>];
backgroundImage.alpha = 0.5; // Yes, this should be 0.5. The background should be a bit lucid
backgroundImage.opaque = YES; // I want the white background of the parent UIView to show through
[foregroundImage initWithImage:<...>];
foregroundImage.alpha = 1; // Yes, this should be 1. The surrounding space is clear...
backgroundImage.opaque = YES;
[self addSubview:backgroundImage];
[self addSubview:foregroundImage];
[self bringSubviewToFront:foregroundImage];
[self setNeedsLayout];
[foregroundImage setNeedsDisplay];
[backgroundImage setNeedsDisplay];
[self setNeedsDisplay];
...
}
- (void) drawRect: (CGRect) rect
{
...
// update the images to latest
[backgroundImage setImage:<..new..>];
[foregroundImage setImage:<..new..>];
[backgroundImage setNeedsDisplay]; // necessary?
[foregroundImage setNeedsDisplay]; // necessary?
[self setNeedsDisplay]; // necessary?
...
}
@end
结果呢?没有。没有更新。我已经读过其他人也有这个问题(UIImageView在设置Image属性时没有更新)但是没有看到解决方案。图像来自触摸事件期间正在写入的屏幕外缓冲区等。
我知道这些缓冲区有正确的图像,因为如果我做了类似的事情:
CGImageRef bitmap = CGBitmapContextCreateImage(bufferContext);
CGContextDrawImage( UIGraphicsGetCurrentContext(), CGRectMake(0,0,self.bounds.size.width, ...height), bitmap);
CGImageRelease(bitmap);
......我能看到正确的形象。 UIImageViews似乎不想更新。它们的不透明度等也相应地设定。
会继续磨,不想为此写一个黑客。应该有一种简单,优雅的方式...
感谢任何帮助/指导。
答案 1 :(得分:0)
我发现之前的StackOverflow帖子非常有帮助。它完成了两个图像的合并,而不是通过视图,而是通过使用Quartz 2D API。仍然让我完成了我想要的目标。