Как мой пользовательский UIView может получить четкий фон?

Вопрос:

Мне нужно сделать свой собственный UITableViewCellAccessoryDisclosureIndicator, чтобы у меня были пользовательские цвета. Мне нужно установить фон для очистки. Независимо от того, что я пытаюсь, я не могу заставить clearColor работать. Когда я меняю строку CGContextSetFillColorWithColor ниже на redColor, она красная. Я пробовал установить opaque и backgroundColor, а затем вызвал super drawRect с удаленным кодом заполнения и с моим заполняющим кодом, но это все еще не хорошо. Я также пробовал CGContextClearRect различными способами.

Вот красная цветовая версия от симулятора. Мне нужно, чтобы UIView был ясным, чтобы изображение с хорошим фоном отображалось.

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

screenshot

- (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);
}

Ответ №1

Как насчет этого?

self.contentView.opaque = NO;
self.backgroundColor = [UIColor clearColor];

Оцените статью
TechArks.Ru
Добавить комментарий