Я проделал большой поиск в Интернете, но сейчас я пытаюсь работать с «Живыми фотографиями» на Playground. Я знаю рамки (PHLivePhoto), я просто понятия не имею, если работать с ними на Playground возможно из-за того факта, что нечего «импортировать», поскольку, похоже, нет доступных «живых фотографий» для загрузки онлайн. Есть идеи?Работа с живыми фотографиями на игровой площадке
ответ
Можно сделать и посмотреть PHLivePhoto на игровой площадке с элементами фактического Live Photo.
В Photos
приложение OS X, выберите в Live Photo и перейдите в меню
Файл> Экспорт> Экспорт оригинальный ...
Это создаст .JPG
и a .mov
.
Оставьте эти два файла в папке Resources
игровой площадки (меню «Вид»> «Навигаторы»> «Навигатор проекта»).
Получить 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")!
И создать реальное изображение, нам необходимо его для Live Photo просмотра изображения:
let prevImg = UIImage(named: "IMG_0001.JPG")!
Импорт необходимых рамок:
import Photos
import PhotosUI
import XCPlayground
и установить Экспозицию в асинхронном режиме:
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
Теперь мы будем использовать PHLivePhoto
«s 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)
}
}
}
Тогда мы называем так:
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)
}
Обратите внимание, что, поскольку нет возможности взаимодействовать с живым представлением, чтобы начать воспроизведение Live Photo, мы должны сделать это самостоятельно с помощью метода PHLivePhotoView
startPlaybackWithStyle
.
Вы можете заставить живое представление появляться на площадке, показывая помощника редактора в меню
View> Помощник редактора> Показать помощник редактора
Примечание: для игровой площадки может потребоваться некоторое время, чтобы создать PHLivePhoto и начать просмотр в реальном времени.
С Xcode 7.3b + мы можем, наконец, есть взаимодействие пользовательского интерфейса в игровых площадках.
Я сделал адаптацию этого ответа с помощью простого просмотра и 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()
Она работает довольно хорошо, через пару секунд, чтобы загрузить и немного задержки, но в остальном его все хорошо :) – Idris
это, безусловно, один из моих Favorit e ответы на переполнение стека, хотя код может не работать с Swift 3.0.2, казалось, что Apple внесла некоторые изменения в живое фото (? – XueYu
@ XueYu Ах, спасибо. ^^ Я сделал обновление, теперь он работает: мне пришлось изменить Int на NSNumber для значения PHLivePhotoInfoCancelledKey и уменьшить размер предварительного просмотра, чтобы ускорить все это. – Moritz