PHAsset Создать с данными настройки за один раз - PullRequest
0 голосов
/ 04 октября 2018

TL, DR:

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

Фон

Я разрабатываю расширение для редактирования фотографий для iOS и предоставляю аналогичные функции в приложении контейнера.

Для лучшего повторного использования кода и модульности я использую поток на основе PHContentEditingController как для расширения (обязательно), так и для приложения-контейнера, объединяя все общие компоненты во встроенную среду, которая используется как приложением, так и приложением.ссылка на расширение ( в соответствии с рекомендациями Apple ).


В отличие от расширения приложения, которое «передает» изображение для редактирования приложением Photos и выполняет под его контролем,Контейнерное приложение должно запрашивать изменения в библиотеке ресурсов, каждое из которых приводит к тому, что у пользователя запрашивается авторизация.

При запуске приложение предлагает пользователю два варианта выбора изображения для редактирования:

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

(конечно, оба варианта зависят от UIImagePickerController)

В настоящий момент изображения, считанные из библиотеки, проходят одинаковоредактирование потока, как в расширении приложения, с той лишь разницей, что мой собственный код пользовательского интерфейса вручную вызывает finishContentEditing(completionHandler:) для (общего) объекта, который принимает протокол PHContentEditingController, и, по завершении, вызывает далее PHAssetLibraryметод performChanges(_:completionHandler) (который вызывает запрос на авторизацию).

Это означает, что изменения, сделанные в приложении контейнера, могут быть отменены при повторном редактировании того же изображения с расширением в приложении Photos. (и, возможно, наоборот, как только я получу поддержку данных регулировки).

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

UIImageWriteToSavedPhotosAlbum(_:_:_:_:)

(в те времена, когда метки аргументов еще не были: -)


Проблема

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

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

  1. Создать новый актив
  2. Сохранить измененияк новому активу

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

Итак,у меня такой вопрос:

Есть ли способ создать библиотечный актив "за один раз", исходное изображение и данные корректировки?

1 Ответ

0 голосов
/ 23 октября 2018

Хотя я еще не пробовал это в своем коде (у меня больше неотложных проблем сейчас), я, кажется, нашел то, что кажется точным ответом на мой вопрос в документации Appleдля одного из инициализаторов класса PHContentEditingOutput :

init(placeholderForCreatedAsset: PHObjectPlaceholder)

Из документов:

Обсуждение

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

Также:

Примечание

Если ваше приложение редактирует содержимоересурсов, уже находящихся в библиотеке Photos, включая ресурсы, которые недавно добавило само ваше приложение, Photos запрашивает у пользователя разрешение на изменение содержимого ресурса.Если вместо этого ваше приложение использует метод init (placeholderForCreatedAsset :) для создания ресурса с отредактированным контентом, Photos распознает право собственности вашего приложения на контент и, следовательно, не нужно запрашивать у пользователя разрешение на его редактирование.


Полагаю, всем нам время от времени нужна здоровая доза RTFM!: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...