У меня есть пользовательский вид контейнера с оранжевым backgroundColor
.В моем пользовательском UIView установка фонового цвета subview заставляет его скрывать мои чертежи drawRect (CGContextRef, CGMutablePathRef и т. Д.). Как исправить?
В этом пользовательском представлении я рисую линии, переопределяя drawRect
. Это отлично работает, пока я не попытаюсь нарисовать линии над subviews.
Вот несколько скриншотов, которые коррелируют с кодом редактирует, чтобы проиллюстрировать этот вопрос я столкнулся:
^ Это изображение показывает мой собственный взгляд с self.graphBackgroundView
настоящее время, но без явного backgroundColor
быть установлен. Моя линия от моего drawRect
видна. Это хорошо.
^ Это изображение показывает мой собственный взгляд с self.graphBackgroundView
настоящее время, но с явной backgroundColor
быть установлен. Это похоже на то, что z-индекс моего зеленого subview выше, чем z-index моего drawRect, или что-то в этом роде.
^ Наконец, это изображение показывает мой собственный взгляд с 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;
}
В то время, когда я писал код, я думал о том, что содержащий пользовательский вид является «единственной вещью». Например, 'drawRect' позаботился о том, чтобы рисовать себя и свои подпрограммы (в моей' init' я их выкладываю ...). Да, теперь я вижу, как это не имеет никакого смысла, когда вы думаете о просмотрах, их внутреннем чертежном коде и т. Д. Во всяком случае, я понял, что теперь ваш ответ веселый. Это очень полезно в том смысле, что оно точно разъясняет, что здесь происходит. Привет, друг, спасибо! –