Работа с живыми фотографиями на игровой площадке

Я много искал в Интернете, но сейчас я пытаюсь работать с "Живыми фотографиями" на Playground. Я знаю рамки (PHLivePhoto), я просто понятия не имею, если работать с ними на Playground возможно из-за того, что там не так много "импортировать", поскольку, похоже, нет доступных "Живых фотографий" для загрузки онлайн. Любые идеи?

Ответы

Ответ 1

Можно создавать и просматривать PHLivePhoto на игровой площадке из элементов реального Live Photo.

В приложении OS X Photos выберите Live Photo и перейдите в меню

Файл > Экспорт > Экспорт оригинала...

введите описание изображения здесь

Он создаст .JPG и .mov.

Отбросьте эти два файла в папке Resources на игровой площадке (меню "Вид" > "Навигаторы" > "Показать навигатор проекта" ).

Получите URL-адреса этих двух файлов с помощью NSBundle (в моем примере файлы "IMG_0001.JPG" и "IMG_0001.mov" ):

let imgURL = NSBundle.mainBundle().URLForResource("IMG_0001", withExtension: "JPG")!
let movURL = NSBundle.mainBundle().URLForResource("IMG_0001", withExtension: "mov")!

И создайте фактическое изображение, мы будем нуждаться в нем для изображения предварительного просмотра Live Photo:

let prevImg = UIImage(named: "IMG_0001.JPG")!

Импортируйте необходимые фреймворки:

import Photos
import PhotosUI
import XCPlayground

И установите Playground в асинхронном режиме:

XCPlaygroundPage.currentPage.needsIndefiniteExecution = true

Теперь мы будем использовать метод PHLivePhoto requestLivePhotoWithResourceFileURLs для создания PHLivePhoto из наших элементов:

func makeLivePhotoFromItems(imageURL: NSURL, videoURL: NSURL, previewImage: UIImage, completion: (livePhoto: PHLivePhoto) -> Void) {
    PHLivePhoto.requestLivePhotoWithResourceFileURLs([imageURL, videoURL], placeholderImage: previewImage, targetSize: CGSizeZero, contentMode: PHImageContentMode.AspectFit) {
        (livePhoto, infoDict) -> Void in
        // for debugging: print(infoDict)
        if let lp = livePhoto {
            completion(livePhoto: lp)
        }
    }
}

Затем мы называем это:

makeLivePhotoFromItems(imgURL, videoURL: movURL, previewImage: prevImg) { (livePhoto) -> Void in
    // "livePhoto" is your PHLivePhoto object
}

Например, скажем, вы хотите, чтобы игровая площадка создала живой вид:

makeLivePhotoFromItems(imgURL, videoURL: movURL, previewImage: prevImg) { (livePhoto) -> Void in
    let rect = CGRect(x: 0, y: 0, width: 2048, height: 1536)
    let livePhotoView = PHLivePhotoView(frame: rect)
    livePhotoView.livePhoto = livePhoto
    XCPlaygroundPage.currentPage.liveView = livePhotoView
    livePhotoView.startPlaybackWithStyle(PHLivePhotoViewPlaybackStyle.Full)
}

Обратите внимание: поскольку нет возможности взаимодействовать с живым представлением, чтобы начать воспроизведение Live Photo, мы должны сделать это сами с помощью метода PHLivePhotoView startPlaybackWithStyle.

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

Вид > Редактор помощников > Показать редактор ассистентов

введите описание изображения здесь

Примечание: для игровой площадки может потребоваться некоторое время, чтобы создать PHLivePhoto и начать просмотр в реальном времени.


С Xcode 7.3b + мы можем, наконец, иметь некоторое взаимодействие с пользовательским интерфейсом на игровых площадках.

Я сделал адаптацию этого ответа с простым представлением и касалсяBegan, просто нажмите LivePhoto, когда консоль говорит так:

import UIKit
import XCPlayground

import Photos
import PhotosUI

class PLView: UIView {

    let image: UIImage
    let imageURL: NSURL
    let videoURL: NSURL

    let liveView: PHLivePhotoView

    init(image: UIImage, imageURL: NSURL, videoURL: NSURL) {
        self.image = image
        self.imageURL = imageURL
        self.videoURL = videoURL
        let rect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
        self.liveView = PHLivePhotoView(frame: rect)
        super.init(frame: rect)
        self.addSubview(self.liveView)
    }

    func prepareLivePhoto() {
        makeLivePhotoFromItems { (livePhoto) in
            self.liveView.livePhoto = livePhoto
            print("\nReady! Click on the LivePhoto in the Assistant Editor panel!\n")
        }
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        print("\nClicked! Wait for it...\n")
        self.liveView.startPlaybackWithStyle(.Full)
    }

    private func makeLivePhotoFromItems(completion: (PHLivePhoto) -> Void) {
        PHLivePhoto.requestLivePhotoWithResourceFileURLs([imageURL, videoURL], placeholderImage: image, targetSize: CGSizeZero, contentMode: .AspectFit) {
            (livePhoto, infoDict) -> Void in
            // This "canceled" condition is just to avoid redundant passes in the Playground preview panel.
            if let canceled = infoDict[PHLivePhotoInfoCancelledKey] as? Int where canceled == 0 {
                if let livePhoto = livePhoto {
                    completion(livePhoto)
                }
            }
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}



XCPlaygroundPage.currentPage.needsIndefiniteExecution = true

let plview = PLView(image: UIImage(named: "IMG_0001.JPG")!,
                 imageURL: NSBundle.mainBundle().URLForResource("IMG_0001", withExtension: "JPG")!,
                 videoURL: NSBundle.mainBundle().URLForResource("IMG_0001", withExtension: "mov")!)

XCPlaygroundPage.currentPage.liveView = plview

plview.prepareLivePhoto()

Тот же пример для Swift 3.0.2 (Xcode 8.2.1):

import UIKit
import PlaygroundSupport
import Photos
import PhotosUI

class PLView: UIView {

    let image: UIImage
    let imageURL: URL
    let videoURL: URL

    let liveView: PHLivePhotoView

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    init(image: UIImage, imageURL: URL, videoURL: URL) {
        self.image = image
        self.imageURL = imageURL
        self.videoURL = videoURL
        let rect = CGRect(x: 0, y: 0, width: 300, height: 400)
        self.liveView = PHLivePhotoView(frame: rect)
        super.init(frame: rect)
        self.addSubview(self.liveView)
    }

    func prepareLivePhoto() {
        makeLivePhotoFromItems { (livePhoto) in
            self.liveView.livePhoto = livePhoto
            print("\nReady! Click on the LivePhoto in the Assistant Editor panel!\n")
        }
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("\nClicked! Wait for it...\n")
        self.liveView.startPlayback(with: .full)
    }

    private func makeLivePhotoFromItems(completion: @escaping (PHLivePhoto) -> Void) {
        PHLivePhoto.request(withResourceFileURLs: [imageURL, videoURL], placeholderImage: image, targetSize: CGSize.zero, contentMode: .aspectFit) {
            (livePhoto, infoDict) -> Void in

            if let canceled = infoDict[PHLivePhotoInfoCancelledKey] as? NSNumber,
                canceled == 0,
                let livePhoto = livePhoto
            {
                completion(livePhoto)
            }
        }
    }

}

let plview = PLView(image: UIImage(named: "IMG_0001.JPG")!,
                    imageURL: Bundle.main.url(forResource: "IMG_0001", withExtension: "JPG")!,
                    videoURL: Bundle.main.url(forResource: "IMG_0001", withExtension: "mov")!)

PlaygroundPage.current.needsIndefiniteExecution = true
PlaygroundPage.current.liveView = plview

plview.prepareLivePhoto()