Перемещения и вставка
Одним пальцем пользователь может перемещать или дублировать выбранные фотографии, текст или другое содержимое, перетаскивая содержимое из одного места в другое, а затем убирая палец для того, чтобы его вставить.
Прикосновение к выбранному контенту и его удержание приводит к тому, что он поднимается и прилипает к пальцу пользователя. При перетаскивании контента анимации и визуальные подсказки определяют возможные места назначения. Система отображает значок, указывающий, что удаление невозможно, или что оно приведет к дублированию содержимого, а не к его перемещению. Для руководства разработчика, см. Drag and Drop в UIKit.
Источники и направления
Перетаскивание включает в себя перемещение выбранного контента из исходного местоположения в место назначения. Эти локации могут находиться в одном и том же контейнере, например, в текстовом представлении или в разных контейнерах, например, в текстовых представлениях на противоположных сторонах разделенного представления. В Notes пользователь может перетащить выделенный текст в новое место в той же заметке. В напоминаниях пользователь может перетаскивать отдельные напоминания из одного списка и помещать их в другой.
На iPad источники и места назначения могут существовать в разных приложениях, что позволяет взаимодействовать между приложениями, то есть перетаскивать фотографию с веб-страницы в Safari в новое сообщение в Mail. При перетаскивании содержимого пользователь может получить доступ к другому приложению через многозадачность, выйдя на главный экран или проведя пальцем вверх от нижней части экрана, чтобы открыть док-станцию.
ЗАМЕТКА
Перетаскивание содержимого между приложениями всегда приводит к дублированию, а не к перемещению содержимого.
Поддержка перетаскивания и вставки
Перетаскивание - это эффективная, интуитивно понятная функция. Если ваше приложение содержит или создает текст, фотографии, видео, аудио или другое содержимое, которое люди захотят переместить, скопировать или вставить, оно должно поддерживать перетаскивание.

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

Разрешите перетаскивание содержимого на элементы управления, когда это применимо. В общем, настройте элементы управления, которые позволяют вводить или выбирать данные, например, текстовые поля для приема вставляемого содержимого.

По возможности используйте стандартные представления текста и текстовые поля. Эти предоставляемые системой элементы включают встроенную поддержку перетаскивания. Для получения дополнительной информации см. Текстовый поля и Виды текста. Для руководства разработчика посмотрите UITextField и UITextView.
Рассмотрите возможность перетаскивания нескольких элементов для большей эффективности. Во многих приложениях пользователь может перетаскивать один элемент одним пальцем и при перетаскивании выбирать дополнительные элементы, касаясь их другим пальцем. Выбранные элементы перемещаются вместе и отображаются под пальцем, который перетаскивают оригинальный. Затем пользователь перетаскивает элементы как группу и вставляет их в нужный пункт назначения. Например, на главном экране можно одновременно выбрать несколько значков приложений и перетащить их в папку. Некоторые приложения, а именно - «Фотографии», предлагают режим выбора, который позволяет собрать несколько элементов перед перетаскиванием.
Определите, должно ли перетаскивание содержимого в вашем приложении приводить к перемещению или копированию. В целом перемещение имеет смысл, когда контейнеры источника и назначения совпадают (перетаскивание текста внутри документа). Копия имеет смысл, когда они различаются (перетаскивание между документами или между приложениями). Однако это не всегда так. Прежде всего, перетаскивание должно вести себя интуитивно. В напоминаниях перетаскивание между списками их перемещает, а не копирует: именно этого ожидают пользователи. Перетаскивание содержимого между приложениями всегда приводит к копированию.

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

Рассмотрите возможность включения пружинной загрузки. При пружинной загрузке пользователи могут активировать определенные элементы управления, такие как кнопки и сегментированные элементы управления, перетаскивая на них выбранный контент и совершая кратковременную паузу, не вставляя при этом контент. Например, в «Почте» выбранные сообщения можно перетащить на кнопку «Назад» на панели навигации, чтобы добраться до других мест в иерархии почтовых ящиков. Никогда не делайте пружинную загрузку единственным способом для активации контроля. Используйте это как дополнительную возможность. В большинстве случаев подпружиненный элемент управления должен реагировать на жест касания. Руководство разработчика см. В разделе UISpringLoadedInteraction.


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

По возможности предлагайте несколько вариантов перетаскиваемых данных, упорядоченных от самого высокого до самого низкого разрешения. Например, при предоставлении векторной графики ваше приложение может предоставить в указанном порядке векторное представление в формате PDF, прозрачное PNG-изображение без потерь качества и непрозрачное JPEG-изображение с потерями. Таким образом, пункт назначения может выбрать представление самого высокого качества, которое он может импортировать.

Когда это применимо, представьте оригинальные версии пользовательских объектов в наилучшем качестве. Например, приложение, которое может перетаскивать диаграммы, должно сначала представить собственный объект диаграммы. Затем оно предлагает альтернативы, то есть графические версии диаграммы для приложений, которые не поддерживают объекты диаграммы.

Реализуйте расширение для провайдера файлов, если передача содержимого вашего приложения занимает много времени или ресурсов. Расширение провайдера файлов управляет процессом передачи и обеспечивает его завершение, даже если ваше приложение больше не работает. Обратите внимание, что процесс передачи не начнётся, пока пользователь не удалит содержимое. Для руководства разработчика посмотрите NSFileProviderExtension.

Предоставляйте информацию о прогрессе, если контент вашего приложения требует время для передачи. Предоставьте информацию о прогрессе, если контент должен быть загружен или большие файлы требуют времени для копирования. Как минимум, укажите общий размер содержимого, чтобы получатель мог рассчитать оставшееся время и отобразить соответствующий индикатор прогресса. Для руководства разработчика см. NSProgress.
Принятие вставляемого контента
Используйте визуальные подсказки для определения потенциальных мест назначения и предварительного просмотра эффекта вставки контента. Подсветка, указатели точек вставки и анимация - все это хорошие способы определения возможных мест назначения. Вид может слегка мигать и менять цвет при перетаскивании содержимого поверх него, а абзацы могут раздвигаться, чтобы освободить место для перетаскиваемого изображения. Если на экране имеется более одного возможного пункта назначения, указывайте по одному за раз. Выделение может быть ненужным, если контейнеры источника и назначения совпадают, содержимое полностью не перетаскивается из источника, а затем повторно вводится в него. Удостоверьтесь, что выделение убрано, когда контент вставлен или не располагается выше места назначения.

Автоматическая прокрутка содержимого пункта назначения, когда это необходимо. Когда содержимое перетаскивается за пределы пункта назначения, вашему приложению необходимо определить, следует прокрутить содержимое пункта назначения или позволить пользователю продолжить перетаскивание в совершенно другой пункт назначения. Если ваше приложение позволяет пользователю продолжать перетаскивание, рассмотрите возможность определения области, которая вызывает автоматическую прокрутку, когда перетаскиваемый элемент располагается над ним. Например, длинное сообщение черновика в Mail автоматически прокручивается, когда содержимое перетаскивается в верхнюю или нижнюю области. Стандартные текстовые представления и поля автоматически подстраиваются под это поведение.

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

Если необходимо, извлекайте только соответствующую часть вставляемого контента. Например, если пользователь перетаскивает контакт из «Контактов» в поле получателя в почтовом сообщении, используются только имя и адрес электронной почты, а не вся информация об адресе контакта.

Показывайте заполнители в табличных и общих представлениях после удаления содержимого. Заполнители временно указывают, где контент будет находиться после завершения передачи.

Показывайте прогресс, если вставляемое содержимое требует времени для передачи. Система отображает модальное оповещение приложения по умолчанию в тот момент, когда происходит длительная передача между приложениями. Подумайте о том, как настроить отображение прогресса (например, показывать индикаторы прогресса на заполнителях в табличном или коллекционном представлении), чтобы пользователь не блокировался. Обратите внимание, что процесс передачи не начинается, пока пользователь не удалит содержимое.

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

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

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

Подумайте над тем, чтобы предоставить удобный, интуитивно понятный способ отказаться, когда пользователь не может немедленно отменить перетаскивание. Например, приложение для обмена может представлять промежуточный общий лист перед публикацией вставляемого контента. Этот общий лист может предложить способ предоставления дополнительного контента (сообщение о состоянии), а также предлагает кнопку отмены. Аналогичная ситуация происходит и с фотографиями, когда они перетаскиваются в общий поток.