所以,我有一个自定义UIView子类使圆边的图。 事情画完美,但背景总是充满整个范围,尽管剪辑的路径优先。 边框还提请矩形背景之上 ,尽管我绘制的drawRect边境的事实:背景前。 所以我删除的drawRect :,的全部内容也就是现在实际上是空的 - 不过背景被画!
任何人对此的解释? 我在Interface Builder中的backgroundColor。 谢谢!
所以,我有一个自定义UIView子类使圆边的图。 事情画完美,但背景总是充满整个范围,尽管剪辑的路径优先。 边框还提请矩形背景之上 ,尽管我绘制的drawRect边境的事实:背景前。 所以我删除的drawRect :,的全部内容也就是现在实际上是空的 - 不过背景被画!
任何人对此的解释? 我在Interface Builder中的backgroundColor。 谢谢!
对不起,这个独白。 :)
问题是,该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)指定的颜色。
这里有一个更简单的解决办法:
self.backgroundColor = [UIColor clearColor];
我毫不犹豫地提出这一点,因为我不想得罪你,但你设置不透明的NO?
这是容易复制:
创建一个基于视图的新的iPhone应用程序。 创建UIView子类,并留下了drawRect:方法完全是空的。 在Interface Builder中,拖动一个UIView到主视图,它分配一个背景颜色和类视图设置为您的子类。 保存,建立和运行,并看到,该视图显示背景颜色。
我已经规避了通过重写setBackgroundColor这种行为:和分配的颜色,我自己的伊娃,总是留下backgroundColor属性为零。 这工作,但我仍然不知道为什么这这种方式工作。
你应该设置
clearsContextBeforeDrawing = NO
就这么简单。
从UIView的参考文档
哎呀。 我误解了这个问题。 该OP(楼主)希望自己的自定义控制,支持标准“的backgroundColor”属性(例如,通过GUI设计器中设置),但不希望系统油漆颜色。 在OP想画的BG自己,使他可以磨圆边角处。
在这种情况下,有关覆盖层级别绘图后是正确的。
该解决方案我张贴将会阻止UI系统从图纸之前清除缓冲区。 如果你没有定义BG,如果clearsContextBeforeDrawing设置,iOS的将清除您的视图的缓冲区,所有像素设置为透明的黑色。 这样做了全屏视图需要在iPad3的5ms左右,所以它不是免费的(即推2048x1536像素永远是)。 为了比较绘制全屏幕的位图(使用kCGBlendModeCopy强制的blitting)开〜25ms的(使用石英,而不是GPU)。