[英]Working with Live Photos in Playground
I've done a fair amount of searching the web, but I'm currently attempting to work with "Live Photos" in Playground. 我已经做了大量的网络搜索,但我现在正试图在Playground中使用“Live Photos”。 I'm aware of the framework (PHLivePhoto), I just have no clue if working with them in Playground is possible due to that fact that there's not much to "import" as there doesn't seem to be any "Live Photos" available for download online. 我知道这个框架(PHLivePhoto),我不知道如果在Playground中与他们合作是可能的,因为没有太多的“导入”,因为似乎没有任何“实时照片”可用在线下载。 Any ideas? 有任何想法吗?
It's possible to make and view a PHLivePhoto in the Playground from the elements of an actual Live Photo . 可以从实际Live Photo的元素中制作和查看Playground中的PHLivePhoto。
In OS X's Photos
app, select a Live Photo and go to menu 在OS X的Photos
应用程序中,选择一张实时照片并转到菜单
File > Export > Export original... 文件>导出>导出原始...
It will create a .JPG
and a .mov
. 它将创建一个.JPG
和一个.mov
。
Drop these two files in the Resources
folder of the Playground (menu View > Navigators > Show Project Navigator). 将这两个文件放在Playground的Resources
文件夹中(菜单View> Navigators> Show Project Navigator)。
Get the URLs for these two files with NSBundle
(in my example the files are "IMG_0001.JPG" and "IMG_0001.mov"): 使用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")!
And create an actual image, we will need it for the Live Photo preview image: 并创建一个实际图像,我们需要它为Live Photo预览图像:
let prevImg = UIImage(named: "IMG_0001.JPG")!
Import the necessary frameworks: 导入必要的框架:
import Photos
import PhotosUI
import XCPlayground
And set the Playground in asynchronous mode: 并以异步模式设置Playground:
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
Now we're going to use PHLivePhoto
's requestLivePhotoWithResourceFileURLs
method to create a PHLivePhoto from our elements: 现在我们将使用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)
}
}
}
Then we call like this: 然后我们这样打电话:
makeLivePhotoFromItems(imgURL, videoURL: movURL, previewImage: prevImg) { (livePhoto) -> Void in
// "livePhoto" is your PHLivePhoto object
}
For example, let's say you want the Playground to make a live view: 例如,假设您希望Playground制作实时视图:
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)
}
Note that since there's no way to interact with the live view to start the playback of the Live Photo we have to do it ourselves with PHLivePhotoView
's startPlaybackWithStyle
method. 请注意,由于无法与实时视图交互以开始播放Live Photo,因此我们必须使用PHLivePhotoView
的startPlaybackWithStyle
方法PHLivePhotoView
。
You can force the live view to appear in the Playground by showing the Assistant Editor in menu 您可以通过在菜单中显示“助理编辑器”来强制实时视图显示在Playground中
View > Assistant Editor > Show Assistant Editor 查看>助理编辑器>显示助理编辑器
Note: it can take some time for the Playground to create the PHLivePhoto and initiate the live view. 注意:Playground可能需要一些时间来创建PHLivePhoto并启动实时视图。
With Xcode 7.3b+ we can finally have some UI interaction in Playgrounds. 使用Xcode 7.3b +,我们终于可以在Playgrounds中进行一些UI交互。
I've made an adaptation of this answer with a simple view and touchesBegan, just click the LivePhoto when the console says so: 我用简单的视图和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()
The same example for Swift 3.0.2 (Xcode 8.2.1 ): 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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.