2016-12-09 1 views
0

У меня есть пользовательский вид контейнера с оранжевым backgroundColor.В моем пользовательском UIView установка фонового цвета subview заставляет его скрывать мои чертежи drawRect (CGContextRef, CGMutablePathRef и т. Д.). Как исправить?

В этом пользовательском представлении я рисую линии, переопределяя drawRect. Это отлично работает, пока я не попытаюсь нарисовать линии над subviews.

Вот несколько скриншотов, которые коррелируют с кодом редактирует, чтобы проиллюстрировать этот вопрос я столкнулся:

enter image description here ^ Это изображение показывает мой собственный взгляд с self.graphBackgroundView настоящее время, но без явного backgroundColor быть установлен. Моя линия от моего drawRect видна. Это хорошо.

enter image description here ^ Это изображение показывает мой собственный взгляд с self.graphBackgroundView настоящее время, но с явной backgroundColor быть установлен. Это похоже на то, что z-индекс моего зеленого subview выше, чем z-index моего drawRect, или что-то в этом роде.

enter image description here ^ Наконец, это изображение показывает мой собственный взгляд с self.graphBackgroundView настоящее, явный backgroundColor быть установлен (еще зеленый), но с self.graphBackgroundView.layer.opacity набора до 0,25. Здесь мы снова видим линию drawRect, но это не совсем правильно, мы действительно хотим, чтобы линия целиком рисовала сверху, а не снизу.

Настоящая проблема - это то, что мы видим в зеленом скриншоте. Нам нужен непрозрачный зеленый подъярус, мы просто хотим, чтобы наша белая линия рисовала поверх него.

Любая помощь очень ценится!

Вот код:

- (void)drawRect:(CGRect)rect 
{ 
    // GET CONTEXT 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // INIT PATH 
    CGMutablePathRef path = CGPathCreateMutable(); 

    // CONFIG PATH 
    CGContextSetLineWidth(context, 1.0); 
    CGContextSetStrokeColor(context, CGColorGetComponents([UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0].CGColor)); // 4 color component white for use with CGColorGetComponents 

    // ESTABLISH STARTING POINT 
    CGPathMoveToPoint(path, NULL, 0.0, 100.0); 

    // GRAPH NEXT POINT 
    CGPathAddQuadCurveToPoint(path, NULL, 120.0, 160.0, 120.0, 160.0); 

    // GRAPH NEXT POINT 
    CGPathAddQuadCurveToPoint(path, NULL, 130.0, 170.0, 130.0, 170.0); 

    // ADD THE PATH 
    CGContextAddPath(context, path); 

    // DRAW 
    CGContextDrawPath(context, kCGPathStroke); 
} 

- (id)init 
{ 
    self = [super init]; 
    if (self) 
    { 
     // INIT UI ELEMENTS 
     self.graphBackgroundView = [[UIView alloc] init]; 

     // INIT AUTO LAYOUT VIEWS DICT 
     self.viewsDictionary = [NSMutableDictionary new]; 
     [self.viewsDictionary setObject:self.graphBackgroundView forKey:@"graphBackgroundView"]; 

     // TURN ON AUTO LAYOUT 
     self.graphBackgroundView.translatesAutoresizingMaskIntoConstraints = NO; 

     // ESTABLISH VIEW HIERARCHY 
     [self addSubview:self.graphBackgroundView]; 

     // LAYOUT 

     // graphBackgroundView 
     [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(0)-[graphBackgroundView]-(0)-|" options:0 metrics:0 views:self.viewsDictionary]]; 
     [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(topMargin)-[graphBackgroundView]-(bottomMargin)-|" options:0 metrics:@{@"topMargin":self.topMargin,@"bottomMargin":self.bottomMargin} views:self.viewsDictionary]]; 

     // CONFIG 

     // self 
     self.backgroundColor = [UIColor orangeColor]; // My drawRect code DOES draw on top of this color 

     // graphBackgroundView 
     self.graphBackgroundView.backgroundColor = [UIColor greenColor]; // My drawRect code does NOT draw on top of this color 
     //self.graphBackgroundView.layer.opacity = 0.25; // <-- If I uncomment this I can kind of see the line I'm drawing underneath it via the effects of transparency 
    } 
    return self; 
} 

ответ

0

Это как если бы г-индекс моего зеленого подвид выше, чем г-индекс моего DrawRect, либо что-то.

Ну, это точно так. Если у вас есть супервизор и его подпункты, то надзовы рисуются перед надписью. Это часть того, что означает подчинение. Единственный сюрприз в том, что вы удивлены.

+0

В то время, когда я писал код, я думал о том, что содержащий пользовательский вид является «единственной вещью». Например, 'drawRect' позаботился о том, чтобы рисовать себя и свои подпрограммы (в моей' init' я их выкладываю ...). Да, теперь я вижу, как это не имеет никакого смысла, когда вы думаете о просмотрах, их внутреннем чертежном коде и т. Д. Во всяком случае, я понял, что теперь ваш ответ веселый. Это очень полезно в том смысле, что оно точно разъясняет, что здесь происходит. Привет, друг, спасибо! –

Смежные вопросы