在UIScrollView中覆盖drawRect时的黑色背景

时间:2012-07-03 20:52:06

标签: iphone objective-c ios ipad

所以我试图在我的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);  

    }

}

6 个答案:

答案 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委托给超级类导致了这个黑色背景问题。