前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS开发之PHLivePhotoView

iOS开发之PHLivePhotoView

作者头像
YungFan
发布2023-12-05 13:56:33
2450
发布2023-12-05 13:56:33
举报
文章被收录于专栏:学海无涯学海无涯

介绍

  • PHLivePhotoView 也是一个 UIView,专门用于显示 Live Photo。
  • Live Photo 本质是一张 HEIC 格式的封面图片 + 一段 MOV 格式的视频。
  • 默认情况下,Live Photo 只显示封面图片,需要长按才能播放视频。
  • 通过 PHLivePhotoViewDelegate 代理可以监听 Live Photo 的开始播放与结束播放。

案例

代码语言:javascript
复制
import PhotosUI
import UIKit

class ViewController: UIViewController {
    // PHLivePhotoView
    lazy var livePhotoView: PHLivePhotoView = {
        let livePhotoView = PHLivePhotoView(frame: CGRect(x: 0,
                                                          y: 200,
                                                          width: UIScreen.main.bounds.width,
                                                          height: 300))
        livePhotoView.contentMode = .scaleAspectFit
        // 播放时是否静音
        livePhotoView.isMuted = false
        livePhotoView.delegate = self
        return livePhotoView
    }()

    // PHPickerViewController
    lazy var pickerViewController: PHPickerViewController = {
        var configuration = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
        configuration.filter = PHPickerFilter.any(of: [.images, .livePhotos])
        var pickerViewController = PHPickerViewController(configuration: configuration)
        pickerViewController.delegate = self
        return pickerViewController
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(livePhotoView)
    }

    // PHLivePhotoView播放视频
    @IBAction func playButtonClicked(_ sender: Any) {
        livePhotoView.startPlayback(with: .full)
    }

    // 访问相册
    @IBAction func photoButtonClicked(_ sender: Any) {
        present(pickerViewController, animated: true, completion: nil)
    }
}

// MARK: - PHPickerViewControllerDelegate
extension ViewController: PHPickerViewControllerDelegate {
    // 从相册取出LivePhoto显示到PHLivePhotoView
    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
        picker.dismiss(animated: true, completion: nil)
        for result in results {
            let itemProvider = result.itemProvider
            if itemProvider.canLoadObject(ofClass: PHLivePhoto.self) {
                itemProvider.loadObject(ofClass: PHLivePhoto.self) { object, error in
                    guard error == nil else { return }
                    guard let livePhoto = object as? PHLivePhoto else { return }
                    DispatchQueue.main.async {
                        self.livePhotoView.livePhoto = livePhoto
                    }
                }
            }
        }
    }
}

extension ViewController: PHLivePhotoViewDelegate {
    // 能否播放
    func livePhotoView(_ livePhotoView: PHLivePhotoView,
                       canBeginPlaybackWith playbackStyle: PHLivePhotoViewPlaybackStyle) -> Bool {
        print(#function)
        return true
    }

    // 开始播放
    func livePhotoView(_ livePhotoView: PHLivePhotoView,
                       willBeginPlaybackWith playbackStyle: PHLivePhotoViewPlaybackStyle) {
        print(#function)
    }

    // 播放结束
    func livePhotoView(_ livePhotoView: PHLivePhotoView, didEndPlaybackWith playbackStyle: PHLivePhotoViewPlaybackStyle) {
        print(#function)
    }
}

效果

播放Live Photo.gif

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 案例
  • 效果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档