Цвет фона UIView Всегда черный

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

- (void)drawRect:(CGRect)rect
{
    // Drawing code
    self.backgroundColor = [UIColor blueColor];

    UIBezierPath *path = [[UIBezierPath alloc] init];
    [path moveToPoint:CGPointMake(100, 33)];
    [path addLineToPoint:CGPointMake(200, 33)];
    path.lineWidth = 5;
    [[UIColor redColor] setStroke];
    [path stroke];
}

Когда я комментирую drawrect: out и добавляю self.backgroundColor = [UIColor blueColor]; к инициализатору, цвет меняется:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        self.backgroundColor = [UIColor blueColor]
    }
    return self;
}

Почему это и что мне нужно изменить? На самом деле я хотел бы, чтобы фон был прозрачным.

Ответы

Ответ 1

backgroundColor вашего представления игнорируется, если вы рисуете представление самостоятельно, используя drawRect. Измените свой код на

- (void)drawRect:(CGRect)rect
{
    // Drawing code
    [[UIColor blueColor] setFill];  // changes are here
    UIRectFill(rect);               // and here 

    UIBezierPath *path = [[UIBezierPath alloc] init];
    [path moveToPoint:CGPointMake(100, 33)];
    [path addLineToPoint:CGPointMake(200, 33)];
    path.lineWidth = 5;
    [[UIColor redColor] setStroke];
    [path stroke];
}

Ответ 2

Как вы реализуете drawRect:, это переопределит любой чертеж по умолчанию UIView.

Вы должны установить свойство opaque своего пользовательского представления NO и очистить контекст перед отображением пути:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        self.opaque = NO;
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    // Drawing code
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, rect);

    UIBezierPath *path = [[UIBezierPath alloc] init];
    [path moveToPoint:CGPointMake(100, 33)];
    [path addLineToPoint:CGPointMake(200, 33)];
    path.lineWidth = 5;
    [[UIColor redColor] setStroke];
    [path stroke];
}

https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html#//apple_ref/occ/instp/UIView/opaque

Ожидается, что непрозрачное изображение заполнит его границы полностью непрозрачным контента, то есть содержание должно иметь значение альфа 1.0. Если вид непрозрачен и либо не заполняет его границ, либо содержит полностью или частично прозрачный контент, результаты непредсказуемы. Вы должен всегда устанавливать значение этого свойства НЕТ, если вид полностью или частично прозрачно.

Ответ 3

Установите цвет фона в методе initWithFrame: и сделайте свой собственный чертеж внутри drawRect:. Это должно решить вашу проблему. Функция drawRect: реализована для того, чтобы пользовательский чертеж не устанавливал конкретные свойства вида.

@implementation MyView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
      self.backgroundColor = [UIColor yellowColor];
    }
    return self;
}
- (void)drawRect:(CGRect)rect{
    UIBezierPath *path = [[UIBezierPath alloc] init];
    [path moveToPoint:CGPointMake(100, 33)];
    [path addLineToPoint:CGPointMake(200, 33)];
    path.lineWidth = 5;
    [[UIColor redColor] setStroke];
    [path stroke];

}

@end

Ответ 4

backgroundViewController.providesPresentationContextTransitionStyle = YES; backgroundController.definesPresentationContext = YES; [overlayViewController setModalPresentationStyle: UIModalPresentationOverCurrentContext];

или

введите описание изображения здесь

Я боролся много часов. Если его модель segue, установите для текущего контекста как свойство.