2013-10-11 2 views
0

У меня есть метка на мой взгляд. Теперь я хочу нарисовать линию над меткой, что означает, что вы можете видеть, что метка находится под строкой.iOS Нарисуйте линию над меткой

До сих пор я могу нарисовать линию, используя quartz2D, но всегда под меткой. Есть ли способ решить мои проблемы?

+3

Post ваш код, чтобы мы могли помочь вам. – Lefteris

+0

Вы можете сделать UIView, что на два очка выше. –

+0

Когда вы говорите «под этикеткой», вы имеете в виду, что ярлык скрывает линию (в этом случае, если вы измените цвет фона ярлыка, чтобы очистить)? Или вы говорите, что координата 'y' линии, которую вы нарисовали, была такой, что она появилась внизу ярлыка вместо вершины? – Rob

ответ

1

Чтобы быть честным, проще всего создать изображение размером 2x2 с именем [email protected] и иметь нижние 2 пикселя черного цвета, верхние 2 прозрачные, а затем использовать его в качестве фонового изображения для изображения Посмотреть. Протяните изображение до любой необходимой ширины, используя его как образ изображения. 1x изображение должно быть 1x1px, все черным.

UIView *lineView = [[UIView alloc] initWithFrame:frame]; // Whatever frame the line needs 

// Add the line image as a pattern 
UIColor *patternColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"line.png"]]; 
lineView.backgroundColor = patternColor; 
[self.view addSubview:lineView]; 
+0

Зачем использовать изображение? Просто установите 'backgroundColor'' lineView' на любой цвет линии, который вам нужен, и сделайте 'lineView' ровным, одним или двумя точками. – rmaddy

+0

Да, это своего рода решение. – Bill

+0

@rmaddy С изображением вы можете сделать тонкую 1-пиксельную линию на дисплее Retina и не иметь дело с дополнительными условностями с масштабом экрана. –

3

Вы можете создать CAShapeLayer так:

CAShapeLayer *lineLayer = [CAShapeLayer layer]; 
lineLayer.frame = self.label.bounds; 
lineLayer.strokeColor = [UIColor redColor].CGColor; 

CGRect rect = CGRectMake(0, CGRectGetMidY(lineLayer.bounds), lineLayer.bounds.size.width, 2); 
lineLayer.path = [UIBezierPath bezierPathWithRect:rect].CGPath; 

А потом добавить его к UILabel, как это:

[self.label.layer addSublayer:lineLayer]; 
0

Если это метка вы будете использовать много , вы можете сделать подкласс класса UILabel и переопределить функцию drawRect.

- (void) drawRect:(CGRect)r 
{ 
    [super drawRect:r]; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(context); 
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor); 
    CGContextSetLineWidth(context, 1.0); 
    CGContextMoveToPoint(context, 1.0, 1.0); 
    CGContextAddLineToPoint(context, self.bounds.size.width - 1.0, 1.0); 
    CGContextStrokePath(context); 
    CGContextRestoreGState(context); 
} 

Преимущество в том, что линия будет «испечена» в виде и будет только однократной. Другие методы, такие как CAShapeLayer или UIView, будут повторно отображены в каждом кадре.

Для бонусных очков, вы можете сделать цвет и ширину линии свойства :)

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