CGContextClearRect导致背景颜色为黑色

问题描述:

我有一个UIButton子类,我使用drawRect:绘制边界。当选择按钮时,我想要改变背景颜色,并删除边框。 (手工绘制的边界,因为有时我只需要在一侧的一个边界)CGContextClearRect导致背景颜色为黑色

出于某种原因,当我使用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似乎是造成这个问题。

+0

为什么你不绘制绘制矩形的背景? – Wain 2015-02-11 07:36:59

+0

@Wain - 我猜是因为我在一段时间后添加了绘图代码,所以我没有考虑它。 – 2015-02-11 07:41:43

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

+0

完成,它的工作。谢谢! – 2015-02-11 08:09:14