在iPhone上的子视图后面创建一个透明的UIView

时间:2010-08-01 19:23:52

标签: iphone uiview subview layer

关于第二层位图的问题,其中一个是半透明的。

我有一个名为foo的自定义UIView。我有两个我创建的CGBitmapContext。它们实际上被用作屏幕外缓冲器并且具有相等的矩形尺寸。我想把它们中的两个放在屏幕上,然后将它们分层放在另一个上面。背景应该是半透明的,前景应该是不透明的(但是使用clearColor以便通过背景显示)。结果是你有一个清晰的前景,可以看到未绘制前景的背景图像(clearColor)。

CGContextRef background;
CGContextRef foreground;

我正在尝试在两个CGBitmapContext所在的自定义UIView foo中实现它。我有一个带有子视图(前景)的父视图(背景),我试图在(void)drawRect:(CGRect)rect覆盖中实现它。我已经尝试过反复思考这个问题,但我通常只能得到其中一个视图/位图来显示。

问题1:这是正确的方法吗?我应该尝试使用图层吗?我应该将位图和BLT组合到父/根UIView吗? 问题2:为完成上述任务而提供的任何示例代码均值得赞赏!

谢谢!

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。仍然让我完成了我想要的目标。

blend two uiimages based on alpha/transparency of top image