123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- import AVKit
- import AVFoundation
- import SDWebImage
- import DcCore
- class ContextMenuController: UIViewController {
- let item: GalleryItem
- init(item: GalleryItem) {
- self.item = item
- super.init(nibName: nil, bundle: nil)
- }
- required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- // MARK: - lifecycle
- override func viewDidLoad() {
- super.viewDidLoad()
- let viewType = item.msg.viewtype
- var thumbnailView: UIView?
- switch viewType {
- case .image:
- thumbnailView = makeImageView(image: item.msg.image)
- case .video:
- thumbnailView = makeVideoView(videoUrl: item.msg.fileURL)
- case .gif:
- thumbnailView = makeGifView(gifImage: item.thumbnailImage)
- default:
- return
- }
- guard let contentView = thumbnailView else {
- return
- }
- view.addSubview(contentView)
- contentView.translatesAutoresizingMaskIntoConstraints = false
- NSLayoutConstraint.activate([
- contentView.leftAnchor.constraint(equalTo: view.leftAnchor),
- contentView.rightAnchor.constraint(equalTo: view.rightAnchor),
- contentView.topAnchor.constraint(equalTo: view.topAnchor),
- contentView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
- ])
- }
- private func makeGifView(gifImage: UIImage?) -> UIView? {
- let view = SDAnimatedImageView()
- view.contentMode = .scaleAspectFill
- view.clipsToBounds = true
- view.backgroundColor = DcColors.defaultBackgroundColor
- if let image = gifImage {
- setPreferredContentSize(for: image)
- }
- view.image = gifImage
- return view
- }
- private func makeImageView(image: UIImage?) -> UIView? {
- guard let image = image else {
- safe_fatalError("unexpected nil value")
- return nil
- }
- let imageView = UIImageView()
- imageView.clipsToBounds = true
- imageView.contentMode = .scaleAspectFill
- imageView.image = image
- setPreferredContentSize(for: image)
- return imageView
- }
- private func makeVideoView(videoUrl: URL?) -> UIView? {
- guard let videoUrl = videoUrl, let videoSize = item.thumbnailImage?.size else { return nil }
- let player = AVPlayer(url: videoUrl)
- let playerController = AVPlayerViewController()
- addChild(playerController)
- view.addSubview(playerController.view)
- playerController.didMove(toParent: self)
- playerController.view.backgroundColor = .darkGray
- playerController.view.clipsToBounds = true
- player.play()
- playerController.player = player
- // truncate edges on top/bottom or sides
- let resizedHeightFactor = view.frame.height / videoSize.height
- let resizedWidthFactor = view.frame.width / videoSize.width
- let effectiveResizeFactor = min(resizedWidthFactor, resizedHeightFactor)
- let maxHeight = videoSize.height * effectiveResizeFactor
- let maxWidth = videoSize.width * effectiveResizeFactor
- let size = CGSize(width: maxWidth, height: maxHeight)
- preferredContentSize = size
- return playerController.view
- }
- private func setPreferredContentSize(for image: UIImage) {
- let width = view.bounds.width
- let height = image.size.height * (width / image.size.width)
- self.preferredContentSize = CGSize(width: width, height: height)
- }
- }
|