所以我试图在我的UIScrolLView中覆盖drawRect,但是它给了我这个黑色背景而不是我为UIScrollView指定的背景颜色。为什么是这样?如果我删除了drawRect代码,那么一切都很好:
- (void)drawRect:(CGRect)rect
{
[super drawRect:rect];
if (shouldDrawVerticalLineForProfile){
CGContextRef context = UIGraphicsGetCurrentContext();
CGColorRef separatorColor = [UIColor colorWithRed:47.0/255.0 green:47.0/255.0
blue:47.0/255.0 alpha:1.0].CGColor;
// Add at bottom
CGPoint startPoint = CGPointMake(60, 0);
CGPoint endPoint = CGPointMake(60, 10000);
CGContextSaveGState(context);
CGContextSetLineCap(context, kCGLineCapSquare);
CGContextSetStrokeColorWithColor(context, separatorColor);
CGContextSetLineWidth(context, 5.0);
CGContextMoveToPoint(context, startPoint.x + 0.5, startPoint.y + 0.5);
CGContextAddLineToPoint(context, endPoint.x + 0.5, endPoint.y + 0.5);
CGContextStrokePath(context);
CGContextRestoreGState(context);
}
}
答案 0 :(得分:21)
我猜你要搜索的是:
myScrollViewInstance.opaque = NO
之后滚动视图的背景不再是黑色。
答案 1 :(得分:12)
在我的UIScrollView子类中覆盖drawRect时遇到了类似的情况。
简单地覆盖:
- (void)drawRect:(CGRect)rect
{
[super drawRect:rect];
}
导致黑色背景而不是我想要的清晰背景而不会覆盖。
我发现这是因为在Interface Builder中将视图背景设置为默认,并将其设置为Clear Color
解决了我的问题。
我不确定这是否与您的问题有关,但我认为我会分享,以防它可能会有所帮助。
答案 2 :(得分:6)
这里的答案在AppleDocs中非常清楚地记录了UIView的drawRect:
方法。第一句话是:
此方法的默认实现不执行任何操作。
所以,这里打电话给super的建议不会有所帮助。其余的答案将在讨论中进一步讨论:
...如果视图的opaque属性设置为YES,则drawRect:方法必须使用不透明内容完全填充指定的矩形。
这意味着如果您不打算拥有透明背景,则需要实际绘制背景。最正确的方法是使用以下drawRect:
模板:
- (void)drawRect:(CGRect)rect
{
[super drawRect:rect]; // optional if a direct UIView-subclass, should be called otherwise.
CGContextRef context = UIGraphicsGetCurrentContext();
// Fill the background color, if needed
if (self.opaque) {
UIGraphicsPushContext(context);
CGContextSetFillColorWithColor(context, self.backgroundColor.CGColor);
CGContextFillRect(context, rect);
UIGraphicsPopContext();
}
// Your code here...
}
答案 3 :(得分:4)
这应该有帮助
CGContextSetFillColorWithColor(context, colorBack);
CGContextFillRect(context, self.bounds);
//相应地选择bounds和colorBack
答案 4 :(得分:4)
请为我尝试这项工作
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self setBackgroundColor:[UIColor clearColor]];
}
return self;
}
- (void)drawRect:(CGRect)rect
{
[super drawRect:rect];
if (shouldDrawVerticalLineForProfile){
CGContextRef context = UIGraphicsGetCurrentContext();
CGColorRef separatorColor = [UIColor colorWithRed:47.0/255.0 green:47.0/255.0
blue:47.0/255.0 alpha:1.0].CGColor;
// Add at bottom
CGPoint startPoint = CGPointMake(60, 0);
CGPoint endPoint = CGPointMake(60, 10000);
CGContextSaveGState(context);
CGContextSetLineCap(context, kCGLineCapSquare);
CGContextSetStrokeColorWithColor(context, separatorColor);
CGContextSetLineWidth(context, 5.0);
CGContextMoveToPoint(context, startPoint.x + 0.5, startPoint.y + 0.5);
CGContextAddLineToPoint(context, endPoint.x + 0.5, endPoint.y + 0.5);
CGContextStrokePath(context);
CGContextRestoreGState(context);
}
}
答案 5 :(得分:-1)
唯一对我有用的是在调用setNeedsDisplay
后明确设置背景。在我的示例中,我在地图上使用MKAnnotationView
的子类而不是UIScrollView
,因此我 场景。在我的情况下,我从setNeedsDisplay
致电setAnnotation
,我发现这样做会在backgroundColor
之前重置。只需在backgroundColor
修复问题后按setNeedsDisplay
重新设置。
FWIW,我也注意到,简单地覆盖drawRect
委托给超级类导致了这个黑色背景问题。