128 lines
5.1 KiB
Markdown
128 lines
5.1 KiB
Markdown
|
||
# `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)
|
||
}
|
||
}
|
||
```
|