当我以编程方式向视图控制器添加UIView
时,我无法将背景颜色更改为任何其他颜色,它始终保持黑色。
- (void)drawRect:(CGRect)rect
{
// Drawing code
self.backgroundColor = [UIColor blueColor];
UIBezierPath *path = [[UIBezierPath alloc] init];
[path moveToPoint:CGPointMake(100, 33)];
[path addLineToPoint:CGPointMake(200, 33)];
path.lineWidth = 5;
[[UIColor redColor] setStroke];
[path stroke];
}
当我发表评论drawrect:
并将self.backgroundColor = [UIColor blueColor];
添加到初始化程序时,颜色会发生变化:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.backgroundColor = [UIColor blueColor]
}
return self;
}
为什么这个以及我需要改变什么?其实我希望背景透明。
答案 0 :(得分:26)
在您实施drawRect:
时,这将覆盖UIView
的任何默认图纸。
在渲染路径之前,必须将自定义视图的opaque
属性设置为NO
并清除上下文:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.opaque = NO;
}
return self;
}
- (void)drawRect:(CGRect)rect
{
// Drawing code
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClearRect(context, rect);
UIBezierPath *path = [[UIBezierPath alloc] init];
[path moveToPoint:CGPointMake(100, 33)];
[path addLineToPoint:CGPointMake(200, 33)];
path.lineWidth = 5;
[[UIColor redColor] setStroke];
[path stroke];
}
预计不透明视图将完全不透明填充其边界 内容 - 也就是说,内容的alpha值应为1.0。如果 视图是不透明的,或者不填充其边界或完全包含 或部分透明的内容,结果是不可预测的。 您 如果视图是,则应始终将此属性的值设置为NO 完全或部分透明。
答案 1 :(得分:17)
backgroundColor
自己绘制视图,则会忽略您的视图的 drawRect
。将您的代码更改为
- (void)drawRect:(CGRect)rect
{
// Drawing code
[[UIColor blueColor] setFill]; // changes are here
UIRectFill(rect); // and here
UIBezierPath *path = [[UIBezierPath alloc] init];
[path moveToPoint:CGPointMake(100, 33)];
[path addLineToPoint:CGPointMake(200, 33)];
path.lineWidth = 5;
[[UIColor redColor] setStroke];
[path stroke];
}
答案 2 :(得分:1)
在initWithFrame:方法中设置背景颜色,并在drawRect:中进行自定义绘制。那应该能够解决你的问题。 drawRect:是为了进行自定义绘制而不是设置视图特定属性而实现的。
@implementation MyView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor yellowColor];
}
return self;
}
- (void)drawRect:(CGRect)rect{
UIBezierPath *path = [[UIBezierPath alloc] init];
[path moveToPoint:CGPointMake(100, 33)];
[path addLineToPoint:CGPointMake(200, 33)];
path.lineWidth = 5;
[[UIColor redColor] setStroke];
[path stroke];
}
@end
答案 3 :(得分:1)