CGContextClearRect 导致背景颜色为黑色

Posted

技术标签:

【中文标题】CGContextClearRect 导致背景颜色为黑色【英文标题】:CGContextClearRect causing background color to be black 【发布时间】:2015-02-11 07:30:12 【问题描述】:

我有一个UIButton 子类,我正在使用drawRect: 绘制边界。选择按钮后,我希望更改背景颜色,并删除边框。 (手动绘制边框,因为有时我只需要一侧的边框)

由于某种原因,当我使用 CGContextClearRect 删除已绘制的边框时,我得到黑色背景而不是我设置的颜色:

- (void)setSelected:(BOOL)selected 
    [super setSelected:selected];

    if (selected) 
        self.allOff = YES;
        self.backgroundColor = self.selectedColor;
        [self setTitleColor:[UIColor whiteColor] forState:UIControlStateSelected];
     else 
        self.allOff = NO;
        self.backgroundColor = self.defaultColor;
        [self setTitleColor:[OTAColors colorWithRed:163 green:163 blue:163] forState:UIControlStateNormal];
    



- (void)_setup 

    self.opaque = NO;

    self.defaultColor = [[UIColor whiteColor] colorWithAlphaComponent:0.99];
    self.selectedColor = [[OTAColors colorWithRed:33 green:59 blue:70] colorWithAlphaComponent:0.99];

    self.backgroundColor = self.defaultColor;
    [self setTitleColor:[OTAColors colorWithRed:163 green:163 blue:163] forState:UIControlStateNormal];
    self.titleLabel.font = [UIFont fontWithName:OTAFontPFDinTextCondProMedium size:20];
    self.titleLabel.textAlignment = NSTextAlignmentCenter;



- (void)drawRect:(CGRect)rect 

    CGFloat borderWidth = 0.7f;
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(ctx, borderWidth);
    UIColor *borderColor = self.borderColor ? self.borderColor : [UIColor blackColor];
    CGContextSetStrokeColorWithColor(ctx, borderColor.CGColor);

    if (!self.allOff) 
        // Left
        if (self.left) 
            CGContextMoveToPoint(ctx, 0, 0);
            CGContextAddLineToPoint(ctx, 0,rect.size.height);
            CGContextStrokePath(ctx);
        

        // Right
        if (self.right) 
            CGContextMoveToPoint(ctx, rect.size.width, 0);
            CGContextAddLineToPoint(ctx, rect.size.width,rect.size.height);
            CGContextStrokePath(ctx);
        

        // Top
        if (self.top) 
            CGContextMoveToPoint(ctx, 0, 0);
            CGContextAddLineToPoint(ctx, rect.size.width,0);
            CGContextStrokePath(ctx);
        

        // Bottom
        if (self.bottom) 
            CGContextMoveToPoint(ctx, 0, rect.size.height);
            CGContextAddLineToPoint(ctx, rect.size.width,rect.size.height);
            CGContextStrokePath(ctx);
        
     else 
        CGContextClearRect(ctx, rect);
    


任何想法为什么会发生这种情况? CGContextClearRect 似乎导致了这个问题。

【问题讨论】:

为什么不在draw rect中绘制背景? @Wain - 我猜是因为我很晚才添加绘图代码,所以我没有考虑。 【参考方案1】:

调用 clear rect 会清除所有内容,因此它会恢复为默认的黑色内容。相反,您应该先用背景颜色填充矩形,然后再为边框绘制适当的线条。

【讨论】:

以上是关于CGContextClearRect 导致背景颜色为黑色的主要内容,如果未能解决你的问题,请参考以下文章

imagecopyresampled() 导致分割颜色背景 imagefill()

如何更改此线性布局背景颜色?

css背景颜色会覆盖左边框颜色吗

Photoshop CC 2015无法调整背景颜色

如何根据Angularjs中的背景颜色自动更改文本颜色? [复制]

覆盖 SwiftUI 视图的默认背景颜色?