Ответ 1
Я предполагаю, что вы ищете:
myScrollViewInstance.opaque = NO
После этого фон вашего вида прокрутки больше не будет черным.
Итак, я пытаюсь переопределить 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);
}
}
Я предполагаю, что вы ищете:
myScrollViewInstance.opaque = NO
После этого фон вашего вида прокрутки больше не будет черным.
Я столкнулся с аналогичной ситуацией при переопределении drawRect в моем подклассе UIScrollView.
Просто переопределить:
- (void)drawRect:(CGRect)rect
{
[super drawRect:rect];
}
привел к черному фону вместо желаемого ясного фона, который я бы получил без переопределения.
Я обнаружил, что это было потому, что в представлении Background был установлен Default в Interface Builder, и настройка его на Clear Color
разрешила проблему для меня.
Я не уверен, связано ли это с вашей проблемой, но думал, что я поделюсь ею, если это может помочь.
Это должно помочь
CGContextSetFillColorWithColor(context, colorBack);
CGContextFillRect(context, self.bounds);
//Выберите границы и colorBack соответственно
Пожалуйста, попробуйте эту Работу для меня
- (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);
}
}
Ответ здесь очень четко описан в методе 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...
}
Единственное, что сработало для меня, - это явно указать фон после любого вызова setNeedsDisplay
. В моем примере я использовал подкласс MKAnnotationView
над картой вместо UIScrollView
, поэтому я действительно не знаю, насколько это применимо к сценарию OP. В моем случае я вызывал setNeedsDisplay
из setAnnotation
, и я обнаружил, что это делает сбрасывание на backgroundColor
. Простое повторное установление backgroundColor
после setNeedsDisplay
устраняет проблему.
FWIW, я тоже заметил, что просто переопределение drawRect
для делегирования суперкому классу вызвало эту проблему с черным фоном.