Мне нужно сделать свой собственный UITableViewCellAccessoryDisclosureIndicator, чтобы у меня были пользовательские цвета. Мне нужно установить фон для очистки. Независимо от того, что я пытаюсь, я не могу заставить clearColor работать. Когда я меняю строку CGContextSetFillColorWithColor ниже на redColor, она красная. Я пробовал установить opaque и backgroundColor, а затем вызвал super drawRect с удаленным кодом заполнения и с моим заполняющим кодом, но это все еще не хорошо. Я также пробовал CGContextClearRect различными способами.
Вот красная цветовая версия от симулятора. Мне нужно, чтобы UIView был ясным, чтобы изображение с хорошим фоном отображалось.
Я не очень страшно отношусь к производительности прокрутки, потому что в этой таблице будет очень мало строк.
- (instancetype) init {
self = [super init];
if (!self) return nil;
// [self setOpaque:NO];
// [self setBackgroundColor:[UIColor clearColor]];
return self;
}
- (void)drawRect:(CGRect)rect {
// [super drawRect:rect];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
// my obviously silly/naive attempt at making the background clear
CGContextSetFillColorWithColor(context, [UIColor clearColor].CGColor); // redColor works
CGContextFillRect(context, rect);
// drawing code for chevron
CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);
CGContextSetLineWidth(context, 3.f);
CGContextSetLineJoin(context, kCGLineJoinMiter);
CGContextMoveToPoint(context, PADDING, PADDING);
CGContextAddLineToPoint(context, self.frame.size.width - PADDING, self.frame.size.height/2);
CGContextAddLineToPoint(context, PADDING, self.frame.size.height - PADDING);
CGContextStrokePath(context);
CGContextRestoreGState(context);
}
Места. Флиппины. Инициализаторы. Что за трата времени.
Инициализатором UIView является initWithFrame. initWithFrame не вызывает init. Обратите внимание, что я переопределил init. Я предположил, что initWithFrame вызовет init.
Вот что работает (заметьте, что мне не нужно рисовать фон, хотя я не называю super.drawRect):
- (instancetype) initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (!self) return nil;
// assume decent defaults
[self setColor:[UIColor darkGrayColor]];
[self setBackgroundColor:[UIColor clearColor]];
return self;
}
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGContextSetStrokeColorWithColor(context, [self color].CGColor);
CGContextSetLineWidth(context, 3.f);
CGContextSetLineJoin(context, kCGLineJoinMiter);
CGContextMoveToPoint(context, PADDING, PADDING);
CGContextAddLineToPoint(context, rect.size.width - PADDING, rect.size.height/2);
CGContextAddLineToPoint(context, PADDING, rect.size.height - PADDING);
CGContextStrokePath(context);
CGContextRestoreGState(context);
}
Как насчет этого?
self.contentView.opaque = NO;
self.backgroundColor = [UIColor clearColor];