3

尝试用颜色覆盖UIButton's时遇到此问题。Image

覆盖颜色出现在Image.

这是我的drawRect方法中的代码(我有子类化UIButton):

(void)drawRect:(CGRect)rect
{
    CGRect bounds = self.imageView.bounds;
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
    CGContextTranslateCTM(context, 0.0, self.imageView.image.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextClipToMask(context, bounds, [self.imageView.image CGImage]);
    CGContextFillRect(context, bounds);
}

关于如何在顶部获得红色的任何想法Image

4

1 回答 1

2

成功使用了这个 hacky 代码:

- (void)drawRect:(CGRect)rect
{
    UIImage* img = [self imageForState:UIControlStateNormal];
    [self setImage:nil forState:UIControlStateNormal];
    CGRect bounds = self.imageView.bounds;
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [UIColor colorWithRed:1 green:0 blue:0 alpha:0.2].CGColor);
    CGContextDrawImage(context, bounds, img.CGImage);
    CGContextFillRect(context, bounds);
}

似乎图像是在 drawRect 之后绘制的,所以除非你将它设为 nil,否则它会在你在那里绘制的任何内容之上。

这是解决方案不是最终的。我将用接下来的内容对其进行编辑。

编辑:正确的解决方案是在图像顶部添加一个半透明的 UIView,如下所示:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        UIView* tintView = [[UIView alloc] initWithFrame:self.bounds];
        tintView.backgroundColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:0.2];
        tintView.userInteractionEnabled = NO;
        [self addSubview:tintView];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        UIView* tintView = [[UIView alloc] initWithFrame:self.bounds];
        tintView.backgroundColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:0.2];
        tintView.userInteractionEnabled = NO;
        [self addSubview:tintView];
    }
    return self;
}

注意:您应该在 UIButton 子类中执行此操作。

于 2012-12-26T18:16:41.217 回答