Найти тему

UIPasteControl в iOS 16

Всем привет! Вы на канале школы мобильной разработки SwiftBook. Здесь мы рассказываем и показываем всё, что знаем о языке Swift и Kotlin: увлечённо, понятно и без воды.

С вами Анна Васичко и в этом уроке мы поговорим про новый UI элемент, который называется UIPasteControl: рассмотрим его функционал и реализуем вставку текста из буфера через UIMenu.

Ссылка на видео здесь.

Начнём издалека и сначала обсудим то, как в целом происходит копирование и вставка данных в приложении.

До iOS 14 любое приложение имело доступ к буферу обмена и могло вставлять данные оттуда, не запрашивая дополнительных разрешений.

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

-2

В iOS 16 Apple пошли ещё дальше и решили добавить диалоговое окошко, в котором приложение запрашивает доступ к буферу обмена, чтобы вставить оттуда данные.

-3

Если вы предоставите своё согласие, то это окошко больше возникать не будет. Это разрешение не появится в настройках конфиденциальности приложения.

По крайней мере, в бета версии iOS 16 это происходит так.

Данное окошко будет возникать только в тех случаях, когда приложение пытается получить доступ к буферу обмена без явного намерения пользователя.

Если же вы целенаправленно пытаетесь вставить данные через command+ V или долгий тап по текстовому полю, то никакое предупреждение появляться не будет.

Также вместе с iOS 16 будет доступен новый элемент – UIPasteControl, который может быть использован для целенаправленного обращения к данным в буфере обмена.

Этот элемент выглядит и ведёт себя как кнопка типа filled.

-4

Его внешний вид можно также кастомизировать.

Предлагаю переместиться теперь в проект в XCode и познакомиться с этим элементом.

Разместим и закрепим на экране textView. Вырежем этот текст-заглушку - теперь он находится у нас в буфере.

Добавим на экран новый элемент pasteControl.

В его настройках мы можем поменять стиль отображения, скругление углов, цвет фона и текста, а также назначить target - объект, куда будет вставляться текст по нажатию на pasteControl. Для этого можно просто протянуть лучик к нужному элементу.

Закрепим paste control и запустим симулятор. Нажмём на эту кнопку и текст уставляется в textView.

Пойдём немного дальше и рассмотрим ещё один вариант.

Допустим, мы хотим вставить текст из буфера обмена через одно из действий UIMenu. Разместить pasteControl внутри меню не получится, так как это отдельный UI элемент.

Чтобы рассмотреть этот вариант, я оберну наш экран в Navigation Controllerи также создам аутлет для textView в коде.

Теперь настроим само меню, а потом поговорим про то, как можно реализовать pasteControl внутри него.

Настраивать меню я буду в отдельном методе. Назовём его setupMenu.

В документации мы можем посмотреть, какие свойства есть у класса UIMenu, экземпляр которого мы сейчас будем создавать.

Одно из основных свойств - это свойство children - массив типа UIMenuElement, куда мы поместим как раз действия, которые можно осуществлять при помощи меню.

Согласно документации, нам следует создавать не сами элементы этого типа, а элементы типа наследуемого от UIMenuElement, например UIAction. Что мы и сделаем.

Это будет массив menuElements типа UIAction. Сейчас я вставлю сюда 2 action из сниппета. Это UIAction с инициализатором, включающим в себя заголовок, картинку и пустой handler, который я сейчас реализовывать никак не буду.

Теперь добавим ещё один UIAction, реализующий функцию pasteControl.

Для этого нам понадобится инициализатор с идентификатором.

Через него мы укажем, каким должен быть этот UIAction. Мы продемонстрируем нашей системе, что через это действие пользователь будет целенаправленно вставлять текст из буфера обмена.

Никаких дополнительных разрешений система в таком случае запрашивать не будет.

Мы указываем идентификатор UIAction.Identifier.paste

А в замыкании в этот раз реализуем выставку текста из буфера в textView

Сначала получаем строку из буфера, делаем опциональную привязку и помещаем строку в textView:

handler: { _ in

let pasteboardContent = UIPasteboard.general.string

if let pasteboardContent {

self.mainTextView.text = pasteboardContent

}

}

Теперь сформируем само меню, создавая экземпляр класса UIMenu и инициализируя свойство children

let demoMenu = UIMenu(children: menuItems)

А также добавим кнопку, по которой меню будет открываться

let plusButton = UIBarButtonItem(image: UIImage(systemName: "plus.circle"), menu: demoMenu)

navigationItem.rightBarButtonItem = plusButton

Вызовем этот метод во viewDidLoad и посмотрим, как всё работает.

Итак, в этом уроке мы познакомились с новым элементом UIPasteControl, рассмотрели, как он работает, а также затронули реализацию вставки текста из буфера через UIMenu.

На этом у меня всё, спасибо за внимание!

Подписывайся на наши соцсети: Telegram / VKontakte
Вступай в открытый чат для iOS-разработчиков:
t.me/swiftbook_chat