Idr*_*ris 18 uikit ios swift swift-playground phlivephoto
我已经做了大量的网络搜索,但我现在正试图在Playground中使用"Live Photos".我知道这个框架(PHLivePhoto),我不知道如果在Playground中与他们合作是可能的,因为没有太多的"导入",因为似乎没有任何"实时照片"可用在线下载.有任何想法吗?
aya*_*aio 27
可以从实际Live Photo的元素中制作和查看Playground中的PHLivePhoto .
在OS X的Photos应用程序中,选择一张Live Photo并转到菜单
文件>导出>导出原始...
它将创建一个.JPG和一个.mov.
将这两个文件放在ResourcesPlayground 的文件夹中(菜单View> Navigators> Show Project Navigator).
获取这两个文件的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")!
Run Code Online (Sandbox Code Playgroud)
并创建一个实际图像,我们将需要它为Live Photo预览图像:
let prevImg = UIImage(named: "IMG_0001.JPG")!
Run Code Online (Sandbox Code Playgroud)
导入必要的框架:
import Photos
import PhotosUI
import XCPlayground
Run Code Online (Sandbox Code Playgroud)
并以异步模式设置Playground:
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
Run Code Online (Sandbox Code Playgroud)
现在我们将使用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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我们这样打电话:
makeLivePhotoFromItems(imgURL, videoURL: movURL, previewImage: prevImg) { (livePhoto) -> Void in
// "livePhoto" is your PHLivePhoto object
}
Run Code Online (Sandbox Code Playgroud)
例如,假设您希望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)
}
Run Code Online (Sandbox Code Playgroud)
需要注意的是,因为没有办法与实时取景交互启动Live照片我们必须做到这一点的自己的播放PHLivePhotoView的startPlaybackWithStyle方法.
您可以通过在菜单中显示"助理编辑器"来强制实时视图显示在Playground中
查看>助理编辑器>显示助理编辑器
注意:Playground可能需要一些时间来创建PHLivePhoto并启动实时视图.
使用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()
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3835 次 |
| 最近记录: |