Как рисовать пальцем и экспортировать изображение
В этой короткой статье мы рассмотрим, как добавить в наши приложения представление, в котором пользователи могут рисовать пальцем.
Создать рисунок довольно просто. Сначала мы увидим, как получать позиции касаний и отслеживать движения. Следующим шагом будет соединение этих точек в CGContext
, чтобы получить наш рисунок. Наконец, мы увидим, как сбросить и экспортировать созданный чертеж как UIImage
.
Получение местоположения касаний
Мы начинаем с отслеживания касаний внутри представления.
// 1
- Сначала мы создаем подкласс UIView
многократного использования, чтобы обернуть функцию рисования. В этом классе у нас есть массив массивов, содержащих CGPoint
s. Внешний массив представляет собой линии, каждая из которых состоит из нескольких точек.
// 2
— Поскольку этот класс является подклассом UIView
, мы можем переопределить методы touchesBegan(_:with:)
и touchesMoved(_:with:)
, которые позволяют нам определять местоположение касаний. Эти методы имеют доступ к набору касаний, из которых мы можем получить первую точку касания и преобразовать ее в систему координат этого представления.
// 3
— Теперь, когда у нас есть точка, нам нужно добавить ее в lineArray
. Поскольку touchesBegan
отмечает начало новой строки, мы сначала добавляем к ней пустой массив из CGPoint
. Затем мы добавляем нашу первую точку к этой новой строке.
// 4
- Все последующие точки будут отслеживаться в touchesMoved
. Как и раньше, мы получаем доступ к текущей точке и добавляем ее в наш массив. Наконец, вызывая setNeedsDisplay()
, мы запускаем перерисовку нашего представления.
В следующем методе мы увидим, как рисовать точки.
Рисование линий
Следующий шаг - нарисовать точки для нашего обзора.
// 1
- Чтобы нарисовать точки, нам нужно переопределить метод draw(_:)
. Здесь мы получаем доступ к текущему CGContext
, вызывая UIGraphicsGetCurrentContext()
. Такой контекст определяет место назначения рисования и содержит параметр для визуализации заданных точек, например цвет и толщину линии.
Этот контекст будет передан другому методу, который выполнит собственно рисование. Почему мы используем отдельный метод, станет ясно, когда мы увидим, как экспортировать чертеж в UIImage
.
// 2
— В draw(inContext:)
мы начинаем с настройки данного контекста. Мы устанавливаем его ширину линии на 5, ее цвет на черный и делаем концы линии закругленными, устанавливая cap равным .round
. Конечно, вы можете использовать любую другую конфигурацию, которая вам нравится!
// 3
— Затем мы начинаем рисовать в контексте. Для этого мы перебираем массив строк.
// 4
- Для каждой строки мы получаем первую точку и устанавливаем ее в качестве начальной, вызывая context.move(to:)
.
// 5
- Теперь мы добавляем линию к каждой следующей точке с помощью context.addLine(to:)
и рисуем линию с помощью context.strokePath()
.
Сброс и экспорт чертежа
Наконец, давайте посмотрим, как очистить рисунок или экспортировать его как изображение.
// 1
- Удалить рисунок так же просто, как сбросить lineArray
и вызвать setNeedsDisplay
. Это вызовет новый рендеринг наших точек, но, поскольку их больше не осталось, представление будет пустым.
// 2
— Чтобы экспортировать наш рисунок, сначала нам нужно создать новый UIGraphicsBeginImageContext
того же размера, что и сам вид. Это также установит текущий контекст на вновь созданный, к которому мы получаем доступ, вызывая UIGraphicsGetCurrentContext
.
// 3
— Мы можем повторно использовать наш draw(inContext:)
метод, но на этот раз мы передаем только что созданный контекст изображения.
// 4
- Наконец, мы получаем изображение, вызывая UIGraphicsGetImageFromCurrentImageContext()
, который создаст UIImage
с нашим рисунком.
Следующие шаги
Теперь, когда у нас есть базовый вид для рисования, вы можете продолжить и расширить его, добавив цвета или сделав линии настраиваемыми.
Вот отличный урок Рона Клиффера на raywenderlich.com, где он не только добавляет эти функции, но и показывает альтернативный способ рисования с использованием нескольких UIImageViews
.