Точка соединения двух линий называется перемычкой (Join). Работая с Core Graphics, можно указывать тип перемычки, которую вы хотите сделать между линиями, сочлененными друг с другом. Для выбора такого типа используется процедура CGContextSetLineJoin. Она принимает два параметра: во-первых, графический контекст, в котором вы задаете перемычку такого типа, а во-вторых, сам тип перемычки, CGLineJoin. CGLineJoin — это перечень следующих значений:
Рис. 17.18. Одновременно отрисовываем две линии
• kCGLineJoinMiter — на месте перемычки образуется острый угол. Этот тип задается по умолчанию;
• kCGLineJoinBevel — угол на месте перемычки линий будет немного спрямлен, как будто обтесан;
• kCGLineJoinRound — как понятно из названия, такая перемычка — скругленная.
Рассмотрим пример. Допустим, мы хотим написать программу, способную отрисовывать в графическом контексте «скатные крыши», каждая из которых иллюстрировала бы определенный тип перемычки между линиями, а также выводить под «крышей» текст с названием используемой перемычки. В результате получится рисунок, напоминающий рис. 17.19.
Рис. 17.19. Три типа перемычек между линиями, существующие в Core Graphics
Для решения этой задачи я написал метод drawRooftopAtTopPointof: textToDisplay: lineJoin:, принимающий три параметра:
• точку, в которой должна располагаться верхушка «крыши»;
• текст, отображаемый под «крышей»;
• используемый тип перемычки.
Код будет таким:
— (void) drawRooftopAtTopPointof:(CGPoint)paramTopPoint
textToDisplay:(NSString *)paramText
lineJoin:(CGLineJoin)paramLineJoin{
/* Задаем цвет, которым собираемся отрисовывать линию. */
[[UIColor brownColor] set];
/* Получаем актуальный графический контекст. */
CGContextRef currentContext = UIGraphicsGetCurrentContext();
/* Задаем перемычку между линиями. */
CGContextSetLineJoin(currentContext,
paramLineJoin);
/* Задаем толщину линий. */
CGContextSetLineWidth(currentContext,
20.0f);
/* В этой точке будет начинаться линия. */
CGContextMoveToPoint(currentContext,
paramTopPoint.x — 140,
paramTopPoint.y + 100);
/* В этой точке линия будет заканчиваться. */
CGContextAddLineToPoint(currentContext,
paramTopPoint.x,
paramTopPoint.y);
/* Продолжаем линию до новой точки, чтобы получилась фигура,
напоминающая крышу. */
CGContextAddLineToPoint(currentContext,
paramTopPoint.x + 140,
paramTopPoint.y + 100);
/* Для отрисовки линии используем цвет, заданный в контексте в настоящий
момент. */
CGContextStrokePath(currentContext);
/* Рисуем под крышей текст, при этом используется черный цвет. */
[[UIColor blackColor] set];
/* Теперь рисуем текст. */
CGPoint drawingPoint = CGPointMake(paramTopPoint.x — 40.0f,
paramTopPoint.y + 60.0f);
[paramText drawAtPoint: drawingPoint
withFont: [UIFont boldSystemFontOfSize:30.0f]];
}
А теперь вызовем наш метод в методе экземпляра drawRect: объекта-вида, где находится графический контекст:
— (void)drawRect:(CGRect)rect{
[self drawRooftopAtTopPointof: CGPointMake(160.0f, 40.0f)
textToDisplay:@"Miter"
lineJoin: kCGLineJoinMiter];
[self drawRooftopAtTopPointof: CGPointMake(160.0f, 180.0f)
textToDisplay:@"Bevel"
lineJoin: kCGLineJoinBevel];
[self drawRooftopAtTopPointof: CGPointMake(160.0f, 320.0f)
textToDisplay:@"Round"
lineJoin: kCGLineJoinRound];
}
См. также
Разделы 17.3 и 17.7.