Открыть сервис

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. Типичный процесс выглядит так:

  1. Создание пустого изменяемого пути функцией CGPathCreateMutable().
  2. Добавление точек и сегментов с помощью функций:
  • CGPathMoveToPoint — установка начальной точки подпути.
  • CGPathAddLineToPoint — добавление прямой линии.
  • CGPathAddCurveToPoint — добавление кубической кривой Безье.
  • CGPathAddQuadCurveToPoint — добавление квадратичной кривой Безье.
  • CGPathAddArc — добавление дуги окружности.
  • CGPathAddRect — добавление прямоугольника.
  • CGPathAddEllipseInRect — добавление эллипса, вписанного в прямоугольник.
  • CGPathAddRoundedRect — добавление прямоугольника со скруглёнными углами (доступно с iOS 13 / macOS 10.15).
  • CGPathAddPath — присоединение другого пути.
  1. Закрытие подпути функцией CGPathCloseSubpath (добавляет линию от последней точки к начальной).
  2. Получение неизменяемой копии: 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 анимация свойства path CAShapeLayer позволяет плавно менять форму объекта.

Связь с 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 →