CGPathRef
CGPathRef — это тип данных из фреймворка Core Graphics (CoreGraphics.framework) в операционных системах Apple (iOS, macOS, tvOS, watchOS), представляющий собой непрозрачную ссылку (opaque reference) на объект, описывающий геометрический контур (путь). Контур (path) состоит из последовательности сегментов: прямых линий, кривых Безье, дуг, а также точек начала и конца подпутей. CGPathRef является неизменяемым (immutable) объектом; для создания и модификации путей используется изменяемый аналог — CGMutablePathRef.
Основные характеристики
CGPathRef не является объектом Objective-C, а представляет собой Core Foundation-тип, управляемый функциями с префиксом CGPath. Он хранит векторное описание двумерной фигуры, которая может быть как незамкнутой (открытый контур), так и замкнутой (закрытый многоугольник или криволинейная область). Путь может содержать несколько независимых подпутей (subpaths), каждый из которых начинается с операции перемещения (CGPathMoveToPoint).
Путь не содержит информации о цвете, толщине линии или стиле заливки — эти параметры задаются отдельно при рендеринге в графическом контексте (CGContextRef).
Создание и модификация
Поскольку CGPathRef является неизменяемым, для его построения используется изменяемая версия — CGMutablePathRef. Типичный процесс выглядит так:
- Создание пустого изменяемого пути функцией
CGPathCreateMutable(). - Добавление точек и сегментов с помощью функций:
CGPathMoveToPoint— установка начальной точки подпути.CGPathAddLineToPoint— добавление прямой линии.CGPathAddCurveToPoint— добавление кубической кривой Безье.CGPathAddQuadCurveToPoint— добавление квадратичной кривой Безье.CGPathAddArc— добавление дуги окружности.CGPathAddRect— добавление прямоугольника.CGPathAddEllipseInRect— добавление эллипса, вписанного в прямоугольник.CGPathAddRoundedRect— добавление прямоугольника со скруглёнными углами (доступно с iOS 13 / macOS 10.15).CGPathAddPath— присоединение другого пути.
- Закрытие подпути функцией
CGPathCloseSubpath(добавляет линию от последней точки к начальной). - Получение неизменяемой копии:
CGPathCreateMutableCopy()или просто использование изменяемого пути как CGPathRef (он совместим по типу).
После завершения работы с путём его необходимо освободить функцией CGPathRelease().
Применение
CGPathRef широко используется в графическом программировании под Apple:
- Рисование в Core Graphics: путь передаётся в функции
CGContextAddPath, после чего его можно обвести (CGContextStrokePath) или залить (CGContextFillPath). - Создание фигурных слоёв (CAShapeLayer): свойство
pathкласса CAShapeLayer принимает CGPathRef. Это позволяет отображать произвольные векторные фигуры с анимацией. - Обрезка (Clipping): путь может быть использован для задания области отсечения в графическом контексте через
CGContextClip. - Определение попадания точки (Hit testing): функции
CGPathContainsPointпроверяет, лежит ли заданная точка внутри замкнутого пути. - Создание UIBezierPath: класс
UIBezierPathиз UIKit внутренне использует CGPathRef для хранения геометрии. СвойствоCGPathпозволяет получить или задать Core Graphics-путь. - Анимация формы: в Core Animation анимация свойства
pathCAShapeLayer позволяет плавно менять форму объекта.
Связь с UIBezierPath
В iOS/macOS разработке часто используется класс UIBezierPath (или NSBezierPath в AppKit на macOS), который предоставляет более удобный объектно-ориентированный интерфейс для работы с путями. Однако внутри UIBezierPath хранит CGPathRef. Преобразование между ними выполняется через свойства:
UIBezierPath.cgPath— получение CGPathRef из UIBezierPath.UIBezierPath.init(cgPath:)— создание UIBezierPath из CGPathRef.
Управление памятью
CGPathRef, как и другие Core Foundation-типы, подчиняется правилам управления памятью с подсчётом ссылок (reference counting). При создании пути через функцию, содержащую в названии Create или Copy, вызывающий код получает объект с retain count = 1 и обязан вызвать CGPathRelease после использования. Альтернативно, для автоматического управления памятью в среде ARC (Automatic Reference Counting) в Objective-C можно использовать приведение к id или обёртку в CFBridgingRelease. В Swift Core Foundation-типы автоматически управляются через механизм Unmanaged или с помощью обёрток.
Пример использования (псевдокод)
```objc // Создание пути в форме треугольника CGMutablePathRef path = CGPathCreateMutable(); CGPathMoveToPoint(path, NULL, 100, 100); CGPathAddLineToPoint(path, NULL, 200, 150); CGPathAddLineToPoint(path, NULL, 150, 250); CGPathCloseSubpath(path);
// Использование в графическом контексте CGContextAddPath(context, path); CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor); CGContextStrokePath(context);
// Освобождение CGPathRelease(path); ```
Ограничения
- CGPathRef не поддерживает текстовые элементы — для текста используются отдельные механизмы (Core Text, NSAttributedString).
- Путь не хранит информацию о стилях обводки (толщина, тип соединений, тип концов линии) — это параметры контекста.
- При анимации формы через CAShapeLayer количество сегментов и их типы должны совпадать в начальном и конечном пути для плавного перехода; иначе анимация может стать некорректной.
История
Тип CGPathRef существует с первых версий Core Graphics, представленных в Mac OS X 10.0 (2001 год) и iOS 2.0 (2008 год). С течением времени функциональность расширялась: добавлены операции для скруглённых прямоугольников, эллипсов, улучшена поддержка анимации и работы с кривыми.
Источники
- Apple Inc. Core Graphics Framework Reference. Developer Documentation.
- Apple Inc. Quartz 2D Programming Guide.
- Apple Inc. Core Animation Programming Guide.
- Документация по классу UIBezierPath (UIKit) и NSBezierPath (AppKit).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →