# `DrawingOperation` - протокол для инкапсулирования низкоуровневых вызовов отрисовки CoreGraphicss. Позволяет: - сгруппировать низкоуровневые операции CoreGraphics в более высокоуровневые - использовать композицию из высокоуровневых операций - получить размер изображения необходимый для создания контекста ## Базовые операции "Из коробки" доступны самые часто испольуемые операции. ### `SolidFillDrawingOperation` Операция для заполнения области рисования выбранным цветом и выбранной формой. Например, можно нарисовать прямоугольник или круг на существующей области рисования или просто создать изображение с однотонный фоном. ```swift import TICoreGraphicsUtils import UIKit let solidFillSize = CGSize(width: 200, height: 200) let renderer = UIGraphicsImageRenderer(size: solidFillSize) let solidFillDrawingOperation = SolidFillDrawingOperation(color: UIColor.purple.cgColor, rect: CGRect(origin: .zero, size: solidFillSize)) let solidFillImage = renderer.image { solidFillDrawingOperation.apply(in: $0.cgContext) } ``` ### `BorderDrawingOperation` Операция создаёт рамку определённой формы и размера. ```swift let borderDrawingOperation = BorderDrawingOperation(frameableContentRect: CGRect(origin: .zero, size: solidFillSize), border: 2, color: UIColor.red.cgColor, radius: 4, exteriorBorder: false) let borderImage = renderer.image { borderDrawingOperation.apply(in: $0.cgContext) } ``` ### `CALayerDrawingOperation` Операция отрисовывает содержимое CALayer в изображение. Обычно используется для снапшота UIView. ```swift let button = UIButton(type: .custom) button.setTitle("This is button", for: .normal) button.setBackgroundImage(borderImage, for: .normal) button.sizeToFit() let layerDrawingOperation = CALayerDrawingOperation(layer: button.layer, offset: .zero) let layerRenderer = UIGraphicsImageRenderer(size: button.bounds.size) let buttonSnapshotImage = layerRenderer.image { layerDrawingOperation.apply(in: $0.cgContext) } ``` ### `TextDrawingOperation` Операция отрисовывает текст с заданными атрибутами ```swift let textDrawingOperaton = TextDrawingOperation(text: "This is string", textAttributes: [ .font: UIFont.boldSystemFont(ofSize: 15), .foregroundColor: UIColor.white ]) let textRenderer = UIGraphicsImageRenderer(size: textDrawingOperaton.desiredContextSize) let textImage = textRenderer.image { textDrawingOperaton.apply(in: $0.cgContext) } ``` ### `TemplateDrawingOperation` Операция заменяет все цвета кроме прозрачного на переданный цвет. Используется для приданиям иконкам определённого цвета (аналог tintColor). ```swift if let cgImage = textImage.cgImage { let templateDrawingOperation = TemplateDrawingOperation(image: cgImage, imageSize: textImage.size, color: UIColor.red.cgColor) let tintedImage = textRenderer.image { templateDrawingOperation.apply(in: $0.cgContext) } } ``` ### `TransformDrawingOperation` Операция производит изменение размера изображения учитывая пропорции и другие настройки (по аналогии с contentMode у UIImage). ```swift if let cgImage = textImage.cgImage { let newSize = CGSize(width: textImage.size.width / 1.5, height: textImage.size.height) let resizeOperation = TransformDrawingOperation(image: cgImage, imageSize: textImage.size, maxNewSize: newSize, resizeMode: .scaleAspectFill) let resizeRenderer = UIGraphicsImageRenderer(size: newSize) let resizedImage = resizeRenderer.image { resizeOperation.apply(in: $0.cgContext) } } ```