在Playground中使用实时照片

我已经做了相当数量的searchnetworking,但我目前正试图在Playground中的“实时照片”。 我意识到这个框架(PHLivePhoto),我只是不知道如果在Playground中与他们一起工作是可能的,因为没有太多的“导入”,因为似乎没有任何“现场照片”在线下载。 有任何想法吗?

可以从实际的实时图片的元素中制作和查看操场上的PHLivePhoto。

在OS X的Photos应用程序中,select一个实时照片并进入菜单

文件>导出>导出原始…

在这里输入图像说明

它会创build一个.JPG和一个.mov

将这两个文件放在Playground的Resources文件夹中(菜单View> Navigators> Show Project Navigator)。

NSBundle获取这两个文件的URL(在我的例子中是“IMG_0001.JPG”和“IMG_0001.mov”):

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

并创build一个实际的图像,我们将需要它的实时图片预览图像:

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

导入必要的框架:

 import Photos import PhotosUI import XCPlayground 

并设置Playground在asynchronous模式:

 XCPlaygroundPage.currentPage.needsIndefiniteExecution = true 

现在我们要使用PHLivePhotorequestLivePhotoWithResourceFileURLs方法来从我们的元素创build一个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) } 

请注意,由于无法与实时视图进行交互以开始播放实况图片,因此我们必须使用PHLivePhotoViewstartPlaybackWithStyle方法PHLivePhotoView

您可以通过在菜单中显示助手编辑器强制实时视图显示在操场上

查看>助理编辑器>显示助理编辑器

在这里输入图像说明

注意:Playground可能需要一段时间才能创buildPHLivePhoto并启动实时视图。


使用Xcode 7.3b +,我们终于可以在Playgrounds中进行一些UI交互。

我已经做了一个简单的视图和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()