Working with Live Photos in Playground(在 Playground 中使用实时照片)
问题描述
我已经在网上进行了大量搜索,但我目前正在尝试在 Playground 中使用实时照片".我知道框架(PHLivePhoto),我只是不知道是否可以在 Playground 中使用它们,因为没有太多导入",因为似乎没有任何实时照片"可用用于在线下载.有什么想法吗?
I've done a fair amount of searching the web, but I'm currently attempting to work with "Live Photos" in Playground. 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. Any ideas?
推荐答案
可以在 Playground从实际 Live Photo 的元素中制作和查看 PHLivePhoto.
It's possible to make and view a PHLivePhoto in the Playground from the elements of an actual Live Photo.
在 OS X 的 Photos
应用中,选择一张 Live Photo 并转到菜单
In OS X's Photos
app, select a Live Photo and go to menu
文件 > 导出 > 导出原始文件...
File > Export > Export original...
它将创建一个 .JPG
和一个 .mov
.
It will create a .JPG
and a .mov
.
将这两个文件放到 Playground 的 Resources
文件夹中(菜单 View > Navigator > Show Project Navigator).
Drop these two files in the Resources
folder of the Playground (menu View > Navigators > Show Project Navigator).
使用 NSBundle
获取这两个文件的 URL(在我的示例中,文件是IMG_0001.JPG"和IMG_0001.mov"):
Get the URLs for these two files with NSBundle
(in my example the files are "IMG_0001.JPG" and "IMG_0001.mov"):
let imgURL = NSBundle.mainBundle().URLForResource("IMG_0001", withExtension: "JPG")!
let movURL = NSBundle.mainBundle().URLForResource("IMG_0001", withExtension: "mov")!
并创建一个实际图像,我们将需要它用于 Live Photo 预览图像:
And create an actual image, we will need it for the Live Photo preview image:
let prevImg = UIImage(named: "IMG_0001.JPG")!
导入必要的框架:
import Photos
import PhotosUI
import XCPlayground
并将 Playground 设置为异步模式:
And set the Playground in asynchronous mode:
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
现在我们将使用 PHLivePhoto
的 requestLivePhotoWithResourceFileURLs
方法从我们的元素创建一个 PHLivePhoto:
Now we're going to use PHLivePhoto
's requestLivePhotoWithResourceFileURLs
method to create a PHLivePhoto from our elements:
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
}
例如,假设您希望 Playground 进行实时取景:
For example, let's say you want the Playground to make a live view:
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)
}
请注意,由于无法与实时视图交互来开始播放实时照片,我们必须自己使用 PHLivePhotoView
的 startPlaybackWithStyle
方法来完成.
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.
您可以通过在菜单中显示助手编辑器来强制实时视图出现在 Playground 中
You can force the live view to appear in the Playground by showing the Assistant Editor in menu
查看 > 助理编辑器 > 显示助理编辑器
View > Assistant Editor > Show Assistant Editor
注意:Playground 可能需要一些时间来创建 PHLivePhoto 并启动实时取景.
借助 Xcode 7.3b+,我们终于可以在 Playgrounds 中进行一些 UI 交互了.
With Xcode 7.3b+ we can finally have some UI interaction in Playgrounds.
我已经用一个简单的视图和 touchesBegan 对这个答案进行了改编,只需在控制台这样说时单击 LivePhoto:
I've made an adaptation of this answer with a simple view and touchesBegan, just click the LivePhoto when the console says so:
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("
Ready! Click on the LivePhoto in the Assistant Editor panel!
")
}
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
print("
Clicked! Wait for it...
")
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("
Ready! Click on the LivePhoto in the Assistant Editor panel!
")
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print("
Clicked! Wait for it...
")
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()
这篇关于在 Playground 中使用实时照片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在 Playground 中使用实时照片


- 使用自定义动画时在 iOS9 上忽略 edgesForExtendedLayout 2022-01-01
- Android - 我如何找出用户有多少未读电子邮件? 2022-01-01
- Android viewpager检测滑动超出范围 2022-01-01
- 在测试浓缩咖啡时,Android设备不会在屏幕上启动活动 2022-01-01
- 用 Swift 实现 UITextFieldDelegate 2022-01-01
- android 4中的android RadioButton问题 2022-01-01
- MalformedJsonException:在第1行第1列路径中使用JsonReader.setLenient(True)接受格式错误的JSON 2022-01-01
- Android - 拆分 Drawable 2022-01-01
- 想使用ViewPager,无法识别android.support.*? 2022-01-01
- 如何检查发送到 Android 应用程序的 Firebase 消息的传递状态? 2022-01-01