菜鸟教程小白 发表于 2022-12-12 14:18:28

ios - CGContextClearRect 导致背景颜色为黑色


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

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

<pre><code>- (void)setSelected:(BOOL)selected {
    ;

    if (selected) {
      self.allOff = YES;
      self.backgroundColor = self.selectedColor;
       forState:UIControlStateSelected];
    } else {
      self.allOff = NO;
      self.backgroundColor = self.defaultColor;
       forState:UIControlStateNormal];
    }

}

- (void)_setup {

    self.opaque = NO;

    self.defaultColor = [ colorWithAlphaComponent:0.99];
    self.selectedColor = [ colorWithAlphaComponent:0.99];

    self.backgroundColor = self.defaultColor;
    forState:UIControlStateNormal];
    self.titleLabel.font = ;
    self.titleLabel.textAlignment = NSTextAlignmentCenter;

}

- (void)drawRect:(CGRect)rect {

    CGFloat borderWidth = 0.7f;
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(ctx, borderWidth);
    UIColor *borderColor = self.borderColor ? self.borderColor : ;
    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);
    }

}
</code></pre>

<p>任何想法为什么会发生这种情况? <code>CGContextClearRect</code> 似乎导致了这个问题。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>调用 clear rect 会清除所有内容,因此它会恢复为默认的黑色内容。相反,您应该先用背景颜色填充矩形,然后再为边框绘制适当的线条。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - CGContextClearRect 导致背景颜色为黑色,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/28448790/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/28448790/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - CGContextClearRect 导致背景颜色为黑色