UIView子类绘制背景,尽管完全是空的drawRect: - 为什么?(UIView subcla

2019-08-17 18:41发布

所以,我有一个自定义UIView子类使圆边的图。 事情画完美,但背景总是充满整个范围,尽管剪辑的路径优先。 边框还提请矩形背景之上 ,尽管我绘制的drawRect边境的事实:背景前。 所以我删除的drawRect :,的全部内容也就是现在实际上是空的 - 不过背景被画!

任何人对此的解释? 我在Interface Builder中的backgroundColor。 谢谢!

Answer 1:

对不起,这个独白。 :)

问题是,该UIView的的层显然绘制背景,这是独立drawRect: 这就是为什么你不能得到通过重写摆脱背景drawRect:

您可以覆盖- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx ,使任何你想要的图层绘制,或重写- (void) setBackgroundColor:(UIColor *)newColor并没有分配newColor的backgroundColor,而是你自己的伊娃,像myBackgroundColor。 然后,您可以在使用的drawRect myBackgroundColor; 画你喜欢的背景。


重写setBackgroundColor:

定义一个实例变量来保存你的背景颜色,例如myBackgroundColor。 在你的init方法,建立真正的背景色是clearColor:

- (id) initWithCoder:(NSCoder *)aDecoder
{
    if ((self = [super init...])) {
        [super setBackgroundColor:[UIColor clearColor]];
    }
    return self;
}

覆盖:

- (void) setBackgroundColor:(UIColor *)newColor
{
    if (newColor != myBackgroundColor) {
        [myBackgroundColor release];
        myBackgroundColor = [newColor retain];
    }
}

然后在您的drawRect使用myBackgroundColor:方法。 这样,您就可以使用您的代码与界面生成器(或Xcode4)指定的颜色。



Answer 2:

这里有一个更简单的解决办法:

self.backgroundColor = [UIColor clearColor];


Answer 3:

我毫不犹豫地提出这一点,因为我不想得罪你,但你设置不透明的NO?



Answer 4:

这是容易复制:

创建一个基于视图的新的iPhone应用程序。 创建UIView子类,并留下了drawRect:方法完全是空的。 在Interface Builder中,拖动一个UIView到主视图,它分配一个背景颜色和类视图设置为您的子类。 保存,建立和运行,并看到,该视图显示背景颜色。

我已经规避了通过重写setBackgroundColor这种行为:和分配的颜色,我自己的伊娃,总是留下backgroundColor属性为零。 这工作,但我仍然不知道为什么这这种方式工作。



Answer 5:

你应该设置

clearsContextBeforeDrawing = NO

就这么简单。

从UIView的参考文档

哎呀。 我误解了这个问题。 该OP(楼主)希望自己的自定义控制,支持标准“的backgroundColor”属性(例如,通过GUI设计器中设置),但不希望系统油漆颜色。 在OP想画的BG自己,使他可以磨圆边角处。

在这种情况下,有关覆盖层级别绘图后是正确的。

该解决方案我张贴将会阻止UI系统从图纸之前清除缓冲区。 如果你没有定义BG,如果clearsContextBeforeDrawing设置,iOS的将清除您的视图的缓冲区,所有像素设置为透明的黑色。 这样做了全屏视图需要在iPad3的5ms左右,所以它不是免费的(即推2048x1536像素永远是)。 为了比较绘制全屏幕的位图(使用kCGBlendModeCopy强制的blitting)开〜25ms的(使用石英,而不是GPU)。



文章来源: UIView subclass draws background despite completely empty drawRect: - why?