Подтвердить что ты не робот

Черный фон при переопределении drawRect в UIScrollView

Итак, я пытаюсь переопределить drawRect в моем UIScrolLView, однако он дает мне этот черный фон вместо цвета фона, который я указал для моего 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);  

    }

}
4b9b3361

Ответ 1

Я предполагаю, что вы ищете:

myScrollViewInstance.opaque = NO

После этого фон вашего вида прокрутки больше не будет черным.

Ответ 2

Я столкнулся с аналогичной ситуацией при переопределении drawRect в моем подклассе UIScrollView.

Просто переопределить:

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

привел к черному фону вместо желаемого ясного фона, который я бы получил без переопределения.

Я обнаружил, что это было потому, что в представлении Background был установлен Default в Interface Builder, и настройка его на Clear Color разрешила проблему для меня.

Я не уверен, связано ли это с вашей проблемой, но думал, что я поделюсь ею, если это может помочь.

Ответ 3

Это должно помочь

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

//Выберите границы и colorBack соответственно

Ответ 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

Ответ здесь очень четко описан в методе AppleDocs для UIView drawRect:. Первое предложение:

По умолчанию реализация этого метода ничего не делает.

Итак, предложения здесь назвать супер не помогут. Остальная часть ответа содержится ниже в обсуждении:

... Если для непрозрачного свойства вашего представления установлено значение 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...
}

Ответ 6

Единственное, что сработало для меня, - это явно указать фон после любого вызова setNeedsDisplay. В моем примере я использовал подкласс MKAnnotationView над картой вместо UIScrollView, поэтому я действительно не знаю, насколько это применимо к сценарию OP. В моем случае я вызывал setNeedsDisplay из setAnnotation, и я обнаружил, что это делает сбрасывание на backgroundColor. Простое повторное установление backgroundColor после setNeedsDisplay устраняет проблему.

FWIW, я тоже заметил, что просто переопределение drawRect для делегирования суперкому классу вызвало эту проблему с черным фоном.