Files
Yep/Yep/ViewControllers/MessageMedia/MessageMediaViewController.swift
T

180 lines
6.3 KiB
Swift

//
// MessageMediaViewController.swift
// Yep
//
// Created by NIX on 15/4/24.
// Copyright (c) 2015年 Catch Inc. All rights reserved.
//
import UIKit
import AVFoundation
class MessageMediaViewController: UIViewController {
var message: Message?
@IBOutlet weak var mediaView: MediaView!
@IBOutlet weak var mediaControlView: MediaControlView!
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.setNavigationBarHidden(true, animated: false)
}
override func viewDidLoad() {
super.viewDidLoad()
title = NSLocalizedString("Preview", comment: "")
self.view.backgroundColor = UIColor.blackColor()
self.mediaView.backgroundColor = UIColor.blackColor()
automaticallyAdjustsScrollViewInsets = false
if let message = message {
switch message.mediaType {
case MessageMediaType.Image.rawValue:
mediaControlView.type = .Image
if
let imageFileURL = NSFileManager.yepMessageImageURLWithName(message.localAttachmentName),
let image = UIImage(contentsOfFile: imageFileURL.path!) {
mediaView.image = image
mediaControlView.shareAction = {
let activityViewController = UIActivityViewController(activityItems: [image], applicationActivities: nil)
self.presentViewController(activityViewController, animated: true, completion: { () -> Void in
})
}
}
case MessageMediaType.Video.rawValue:
mediaControlView.type = .Video
mediaControlView.playState = .Playing
if
let videoFileURL = NSFileManager.yepMessageVideoURLWithName(message.localAttachmentName),
let asset = AVURLAsset(URL: videoFileURL, options: [:]),
let playerItem = AVPlayerItem(asset: asset) {
let x = NSFileManager.defaultManager().fileExistsAtPath(videoFileURL.path!)
playerItem.seekToTime(kCMTimeZero)
//mediaView.videoPlayerLayer.player.replaceCurrentItemWithPlayerItem(playerItem)
let player = AVPlayer(playerItem: playerItem)
mediaControlView.timeLabel.text = ""
player.addPeriodicTimeObserverForInterval(CMTimeMakeWithSeconds(0.1, Int32(NSEC_PER_SEC)), queue: nil, usingBlock: { time in
if player.currentItem.status == .ReadyToPlay {
let durationSeconds = CMTimeGetSeconds(player.currentItem.duration)
let currentSeconds = CMTimeGetSeconds(time)
let coundDownTime = Double(Int((durationSeconds - currentSeconds) * 10)) / 10
self.mediaControlView.timeLabel.text = "\(coundDownTime)"
}
})
NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerItemDidReachEnd:", name: AVPlayerItemDidPlayToEndTimeNotification, object: player.currentItem)
mediaControlView.playAction = { mediaControlView in
player.play()
mediaControlView.playState = .Playing
}
mediaControlView.pauseAction = { mediaControlView in
player.pause()
mediaControlView.playState = .Pause
}
mediaView.videoPlayerLayer.player = player
mediaView.videoPlayerLayer.player.addObserver(self, forKeyPath: "status", options: NSKeyValueObservingOptions(0), context: nil)
//mediaView.videoPlayerLayer.player.play()
mediaView.imageView.removeFromSuperview()
mediaControlView.shareAction = {
let activityViewController = UIActivityViewController(activityItems: [videoFileURL], applicationActivities: nil)
self.presentViewController(activityViewController, animated: true, completion: { () -> Void in
})
}
}
default:
break
}
}
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
mediaView.videoPlayerLayer.player.pause()
}
@IBAction func swipeDown(sender: UISwipeGestureRecognizer) {
if let message = message {
if message.mediaType == MessageMediaType.Video.rawValue {
mediaView.videoPlayerLayer.player.removeObserver(self, forKeyPath: "status")
}
}
// dismissViewControllerAnimated(true, completion: nil)
navigationController?.popViewControllerAnimated(true)
}
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
if let player = object as? AVPlayer {
if player == mediaView.videoPlayerLayer.player {
if keyPath == "status" {
switch player.status {
case AVPlayerStatus.Failed:
println("Failed")
case AVPlayerStatus.ReadyToPlay:
println("ReadyToPlay")
dispatch_async(dispatch_get_main_queue()) {
self.mediaView.videoPlayerLayer.player.play()
}
case AVPlayerStatus.Unknown:
println("Unknown")
}
}
}
}
}
func playerItemDidReachEnd(notification: NSNotification) {
mediaControlView.playState = .Pause
if let playerItem = notification.object as? AVPlayerItem {
playerItem.seekToTime(kCMTimeZero)
}
}
override func prefersStatusBarHidden() -> Bool {
return true
}
}