【问题标题】:drawRect in UIView subclass doesn't update imageUIView 子类中的 drawRect 不更新图像
【发布时间】:2012-05-08 17:54:33
【问题描述】:

我有一个 UIView 子类,我想用它来绘制具有不同混合模式的图像。

代码:

@implementation CompositeImageView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

-(void)setBlendMode:(CGBlendMode) composite
{
    blender = composite;
}

-(void)setImage:(UIImage*) img
{
    image = img;
}

- (void)drawRect:(CGRect)rect
{
    NSLog(@"it draws");
    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextSetBlendMode(c, blender);
    CGContextDrawImage(c, rect, image.CGImage);
}

@end

我用来设置它的代码是:

[testImage setImage:[UIImage imageNamed:@"Prayer_Background_Paid"]];
[testImage setBlendMode:kCGBlendModeColor];
[testImage setNeedsDisplay];

我正在使用界面生成器放置一个大的矩形UIView,然后将其类设置为CompositeImageView。但是,它仍然绘制为一个大的白色正方形。即使我注释掉drawRect中的所有内容,它仍然会绘制白色方块。但是,它正在调用 drawRect,因为正在记录“它绘制”。

【问题讨论】:

  • 你确定你的图片不是nil(可能是文件名有错别字)?
  • 是的。我还在项目中尝试了许多其他图像。除非我获取/绘制图像的方式有问题,否则我不知道可能出了什么问题——因此我在这里发布。 (不知道反对票是怎么回事)
  • 你能完成这项工作吗?我现在正在尝试做同样的事情。
  • 不是我最初想要的方式。视图在 drawRect 中绘制自己,然后在 GPU 上合成。因此,它无法与图像下方的内容融合。你也许可以用UIVisualEffectsView 实现类似的东西,但我也不熟悉那个人的内部结构。如果您只是想在背景颜色或其他图像上绘制图像,则可以在调用 CGContextSetBlendMode() 之前绘制该内容。
  • 如果你绝对需要这个效果,你可以在绘制混合图像之前对下面的视图进行快照并使用正确的偏移量绘制该图像,但是如果你想制作它,那很快就会变得非常复杂实时运行。但是,如果“背景”内容不经常更改,您可以很好地伪造它。

标签: objective-c ios uiimage drawrect


【解决方案1】:

您确定 kCGBlendModeColor 是您想要的吗?来自 Apple 文档:

将背景的亮度值与色调和 源图像的饱和度值。

看起来如果是白色背景,混合后的图像也会显示为白色。

【讨论】:

  • Color 只是我尝试过的其中一种——正如我所提到的,我试图完全注释掉 drawRect 方法,但仍然出现白色矩形。
  • 尝试设置 self.backgroundColor = [UIColor clearColor];在初始化中。
  • 将背景颜色设置为清除使它根本不绘制,尽管它仍在调用drawRect方法...
  • 实际上,当我调用 [testImage setbackgroundColor:[UIColor clearColor]] 时,它什么也没画。当我将 [self setBackgroundColor...] 放在 drawRect 方法中时,它仍然绘制白色方块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
  • 2014-11-12
相关资源
最近更新 更多