2015-11-30 8 views
16

Ich habe eine Menge im Internet gesucht, aber ich versuche gerade mit "Live Photos" in Playground zu arbeiten. Ich kenne den Rahmen (PHLivePhoto), ich habe nur keine Ahnung, ob die Arbeit mit ihnen in Playground möglich ist, aufgrund der Tatsache, dass es nicht viel zu "importieren" gibt, da es anscheinend keine "Live Photos" gibt zum Herunterladen online. Irgendwelche Ideen?Arbeiten mit Live-Fotos auf dem Spielplatz

Antwort

21

Es ist möglich, ein PHLivePhoto auf dem Spielplatz aus den Elementen eines tatsächlichen Live-Fotos zu erstellen und anzuzeigen.

In O Photos App X, wählen Sie ein Live Photo und geht zum Menü

Datei> Exportieren> Export original ...

enter image description here

Es hat ein .JPG schaffen und a .mov.

Legen Sie diese beiden Dateien in den Ordner Resources des Playgrounds (Menü Ansicht> Navigatoren> Projektnavigator anzeigen).

die URLs mit NSBundle für diese beiden Dateien erhalten (in meinem Beispiel die Dateien „IMG_0001.JPG“ und „IMG_0001.mov“):

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

Und ein tatsächliches Bild erstellen, werden wir es brauchen für die Live-Fotobildvorschau:

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

importieren Sie die notwendigen Rahmenbedingungen:

import Photos 
import PhotosUI 
import XCPlayground 

Und der Spielplatz im asynchronen Modus eingestellt:

XCPlaygroundPage.currentPage.needsIndefiniteExecution = true 

Jetzt werden wir PHLivePhoto ‚s requestLivePhotoWithResourceFileURLs Methode eine PHLivePhoto unserer Elemente zu erstellen:

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) 
     } 
    } 
} 

Dann wir so nennen:

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

zum Beispiel lassen Sie uns sagen, dass Sie die Spielplatz wollen eine Live-Ansicht machen:

Da es keine Möglichkeit gibt, mit der Live-Ansicht zu interagieren, um die Wiedergabe des Live-Fotos zu starten, müssen wir es selbst mit der startPlaybackWithStyle Methode machen.

Sie können die Live-Ansicht zwingen, die im Spielplatz erscheinen, indem Sie den Assistant Editor in Menü zeigt

Ansicht> Assistant Editor> Show Assistant Editor

enter image description here

Hinweis: Es kann einige Zeit dauern, bis der Playground PHLivePhoto erstellt und die Live-Ansicht initiiert.


Mit Xcode 7.3b + können wir endlich einige UI-Interaktion in Spielplätze haben.

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() 

Das gleiche Beispiel für Swift 3.0.2 (Xcode:

Ich habe eine Anpassung dieser Antwort mit einem einfachen Blick und touchesBegan, klicken Sie einfach auf die LivePhoto, wenn die Konsole sagt so gemacht 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

Es funktioniert ziemlich gut, ein paar Sekunden und ein wenig Verzögerung zu laden, aber sonst alles gut :) – Idris

+0

dies auf jeden Fall einen meines favoriten e Antworten auf Stack-Überlauf, obwohl Code möglicherweise nicht mit Swift 3.0.2 funktioniert, schien Apple einige Änderungen mit Live-Foto (? – XueYu

+1

@XueYu Ah, danke. ^^ Ich habe ein Update gemacht, jetzt funktioniert es: Ich musste Int in NSNumber für den PHLivePhotoInfoCancelledKey Wert ändern und die Größe der Vorschau reduzieren, um das Ganze zu beschleunigen. – Moritz

Verwandte Themen