20

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

    }

}
4

6 回答 6

23

我猜你正在寻找的是:

myScrollViewInstance.opaque = NO

之后,滚动视图的背景不再是黑色。

于 2013-04-04T14:13:08.437 回答
14

在我的 UIScrollView 子类中覆盖 drawRect 时,我遇到了类似的情况。

简单地覆盖:

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
}

导致黑色背景而不是我没有覆盖的所需清晰背景。

我发现这是因为在 Interface Builder 中将 View Background 设置为 Default 并且将其设置为Clear Color解决了我的问题。

我不确定这是否与您的问题有关,但我想我会分享以防万一。

于 2013-10-28T19:38:03.830 回答
8

UIView 方法的 AppleDocs 中非常清楚地记录了这里的答案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...
}
于 2015-12-22T17:29:12.013 回答
4

这应该有帮助

CGContextSetFillColorWithColor(context, colorBack);
CGContextFillRect(context, self.bounds); 

// 相应地选择 bounds 和 colorBack

于 2012-07-03T21:32:09.850 回答
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);  

        }

    }
于 2014-04-03T08:59:38.960 回答
-1

唯一对我有用的是在任何调用setNeedsDisplay. 在我的示例中,我使用的是 a MKAnnotationViewover a map 的子类,而不是 a UIScrollView,所以我真的不知道这在 OP 场景中的适用程度。就我而言,我是从 调用setNeedsDisplaysetAnnotation,我发现这样做会重置backgroundColor。只需在解决问题backgroundColor后重新设置即可。setNeedsDisplay

FWIW,我也观察到简单地覆盖drawRect委托给超类会导致这个黑色背景问题。

于 2014-01-14T03:00:40.567 回答