LeadKit/docs/ticoregraphicsutils/drawingoperations.md

5.1 KiB
Raw Blame History

DrawingOperation - протокол для инкапсулирования низкоуровневых вызовов отрисовки CoreGraphicss.

Позволяет:

  • сгруппировать низкоуровневые операции CoreGraphics в более высокоуровневые
  • использовать композицию из высокоуровневых операций
  • получить размер изображения необходимый для создания контекста

Базовые операции

"Из коробки" доступны самые часто испольуемые операции.

SolidFillDrawingOperation

Операция для заполнения области рисования выбранным цветом и выбранной формой. Например, можно нарисовать прямоугольник или круг на существующей области рисования или просто создать изображение с однотонный фоном.

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

Операция создаёт рамку определённой формы и размера.

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.

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

Операция отрисовывает текст с заданными атрибутами

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).

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).

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)
    }
}