2015-11-30 3 views
16

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

ответ

21

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

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

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

enter image description here

Это создаст .JPG и a .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 

и установить Экспозицию в асинхронном режиме:

XCPlaygroundPage.currentPage.needsIndefiniteExecution = true 

Теперь мы будем использовать PHLivePhoto «s 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, мы должны сделать это самостоятельно с помощью метода PHLivePhotoViewstartPlaybackWithStyle.

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

View> Помощник редактора> Показать помощник редактора

enter image description here

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


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

Я сделал адаптацию этого ответа с помощью простого просмотра и touchesBegan, просто нажмите 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() 
+1

Она работает довольно хорошо, через пару секунд, чтобы загрузить и немного задержки, но в остальном его все хорошо :) – Idris

+0

это, безусловно, один из моих Favorit e ответы на переполнение стека, хотя код может не работать с Swift 3.0.2, казалось, что Apple внесла некоторые изменения в живое фото (? – XueYu

+1

@ XueYu Ах, спасибо. ^^ Я сделал обновление, теперь он работает: мне пришлось изменить Int на NSNumber для значения PHLivePhotoInfoCancelledKey и уменьшить размер предварительного просмотра, чтобы ускорить все это. – Moritz