Swift音乐播放器(不完整版)(Demo)


 

 

音乐列表首页TableView:

//
//  MusicTableViewController.swift
//  Music_Swift
//
//  Created by zhangfei on 15/08/17.
//  Copyright © 2015年 zhangfei. All rights reserved.
//

import UIKit

class MusicTableViewController: UITableViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        //创建管理类对象,实现数据请求
        DataManager.shareDataManager.requestDatas()
        DataManager.shareDataManager.block = {
            //回调block,数据请求完成实现页面刷新
            self.tableView.reloadData()
        }
        
        
        //注册自定义cell
        tableView.registerNib(UINib(nibName: "MusicCell", bundle: nil), forCellReuseIdentifier: "cellID")
        print(DataManager.shareDataManager.allDataArray())
    }

    
    //正在播放按钮监听事件
    
    @IBAction func PlayingBtnAction(sender: UIButton) {
        let VC = PlayMusicController.sharePlayMusicController
        VC.view.backgroundColor = UIColor.whiteColor()
        VC.index = -1
        print(VC.index)
        showDetailViewController(VC, sender: VC.index)
    }
    
    //内存溢出
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        if self.isViewLoaded() && self.view.window == nil {
            self.view = nil
        }
    }

}


extension MusicTableViewController {
    
    //设置tableView有几行
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     
        return DataManager.shareDataManager.allDataArray().count
    }
    //显示cell的内容
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cellID", forIndexPath: indexPath) as! MusicCell
        let music = DataManager.shareDataManager.allDataArray()[indexPath.row]
        cell.music = music
        
        return cell
    }
    
    //返回行高
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 160
    }
    
    //点击事件触发方法
    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        
        let VC = PlayMusicController.sharePlayMusicController
        VC.view.backgroundColor = UIColor.whiteColor()
//        print("!!!!!!!!!!\(indexPath.row)")
        VC.index = indexPath.row
//        print(VC.index)
        self.showDetailViewController(VC, sender: VC.index)
        
    }
    
    
    
    
}

 

音乐Model类:

//
//  Music.swift
//  Music_Swift
//
//  Created by zhangfei on 15/08/17.
//  Copyright © 2015年 zhangfei. All rights reserved.
//

import UIKit

class Music: NSObject {
    
    var mp3Url: String!
    var myID: String!
    var name: String!
    var picUrl: String!
    var blurPicUrl: String!
    var album: String!
    var singer: String!
    var durationStr: String!
    var artists_name: String!
    var lyric: String!
   
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
        if key == "id" {
            self.myID = String(value!)
//            self.myID = String(strideofValue(value as! NSNumber))
        }
        if key == "duration" {
            self.durationStr = String(value!)
//            self.durationStr = String(strideofValue(value as! NSNumber))
        }
    }
    
    
    
}

 

 

音乐列表自定义cell:

//
//  DataManager.swift
//  Music_Swift
//
//  Created by zhangfei on 15/08/17.
//  Copyright © 2015年 zhangfei. All rights reserved.
//

import UIKit

typealias myBlock = () ->Void


class DataManager: NSObject {
    
    
    
    static let shareDataManager = DataManager()
    
    
    private var dataArray = [Music]()
    
    var count: Int? {
        get {
            return self.dataArray.count
        }
    }
    var block: myBlock?
    
    
    
    
    
    func requestDatas() ->Void {
        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
            //
            let url = NSURL(string: kMusicURL)
            let array = NSArray(contentsOfURL: url!)
        
           
            for item in array! {
                let music = Music()
                music.setValuesForKeysWithDictionary(item as! [String : AnyObject])
               
                let mp3Url = item["mp3Url"]
                let myID = item["id"]
                let name = item["name"]
                let picUrl = item["picUrl"]
                let blurPicUrl = item["blurPicUrl"]
                let album = item["album"]
                let singer = item["singer"]
                let duration = item["duration"]
                let artists_name = item["artists_name"]
                let lyric = item["lyric"]
                
                let music = Music(mp3Url: "\(mp3Url)", myID: "\(myID)", name: "\(name)", picUrl: "\(picUrl)", blurPicUrl: "\(blurPicUrl)", album: "\(album)", singer: "\(singer)", duration: "\(duration)", artists_name: "\(artists_name)", lyric: "\(lyric)")
                self.dataArray.append(music)
                
            }
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                //
                self.block!()
            })
        }
    }
    
    func allDataArray() ->Array<Music> {
        let arr = self.dataArray
        return arr
    }

    func selectMusicForIndexPath(indexPath: NSIndexPath) ->Music {
        return self.dataArray[indexPath.row]
    }
    
}

 

音乐Model管理类:

//
//  DataManager.swift
//  Music_Swift
//
//  Created by zhangfei on 15/08/17.
//  Copyright © 2015年 zhangfei. All rights reserved.
//

import UIKit

typealias myBlock = () ->Void


class DataManager: NSObject {
    
    
    
    static let shareDataManager = DataManager()
    
    
    private var dataArray = [Music]()
    
    var count: Int? {
        get {
            return self.dataArray.count
        }
    }
    var block: myBlock?
    
    
    
    
    
    func requestDatas() ->Void {
        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
            //
            let url = NSURL(string: kMusicURL)
            let array = NSArray(contentsOfURL: url!)
        
           
            for item in array! {
                let music = Music()
                music.setValuesForKeysWithDictionary(item as! [String : AnyObject])
               
                let mp3Url = item["mp3Url"]
                let myID = item["id"]
                let name = item["name"]
                let picUrl = item["picUrl"]
                let blurPicUrl = item["blurPicUrl"]
                let album = item["album"]
                let singer = item["singer"]
                let duration = item["duration"]
                let artists_name = item["artists_name"]
                let lyric = item["lyric"]
                
                let music = Music(mp3Url: "\(mp3Url)", myID: "\(myID)", name: "\(name)", picUrl: "\(picUrl)", blurPicUrl: "\(blurPicUrl)", album: "\(album)", singer: "\(singer)", duration: "\(duration)", artists_name: "\(artists_name)", lyric: "\(lyric)")
                self.dataArray.append(music)
                
            }
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                //
                self.block!()
            })
        }
    }
    
    func allDataArray() ->Array<Music> {
        let arr = self.dataArray
        return arr
    }

    func selectMusicForIndexPath(indexPath: NSIndexPath) ->Music {
        return self.dataArray[indexPath.row]
    }
    
}

 

音乐播放器AVPlayer管理类

//
//  PlayerHelper.swift
//  Music_Swift
//
//  Created by zhangfei on 15/08/17.
//  Copyright © 2015年 zhangfei. All rights reserved.
//

import UIKit
import AVFoundation

//设置代理
protocol PlayerHelperDelegate {
    func playStop()
    func playingWithTime(time: Double)
}


class PlayerHelper: NSObject {

    static let sharePlayerHelper = PlayerHelper()
    
    var player = AVPlayer()
    var isPlaying = Bool()
    var timer = NSTimer()
    var delegate: PlayerHelperDelegate?
    
    override init() {
        super.init()
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "playToStop", name: AVPlayerItemDidPlayToEndTimeNotification, object: nil)
    }
    
    func playToStop() ->Void {
        self.delegate!.playStop()
    }
    
    
    
    //播放音乐
    func playMusicWithURL(stringUrl: NSURL) ->Void {
        let playerItem = AVPlayerItem(URL: stringUrl)
        
        self.player.replaceCurrentItemWithPlayerItem(playerItem)
        
        //添加观察者
        player.addObserver(self, forKeyPath: "status", options: .New, context: nil)
    }
    
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        if keyPath == "status" {
            print(player.status)
            if player.status == .ReadyToPlay {
                self.play()
            }
        }
    }
    
    //播放
    func play() ->Void {
        if isPlaying == true {
            return
        }
        player.play()
        isPlaying = true
        
        
        timer = NSTimer.scheduledTimerWithTimeInterval(0.05, target: self, selector: "timerAction", userInfo: nil, repeats: true)
        
    }
    
     //暂停
    func pause() ->Void {
        
        timer.invalidate()
        
        
        if isPlaying == false {
            return
        }
        player.pause()
        isPlaying = false
        
    }
    
   
    
    func timerAction() ->Void {
        let time = self.player.currentTime().value / self.player.currentTime().timescale
        self.delegate!.playingWithTime(time)
    }
    
    
    
    
    
    //声音
    func volumeWithVolumeSliderValue(value: Float) ->Void {
        player.volume = value
    }
    
    
}

音乐播放页面(单例控制器):

//
//  PlayMusicController.swift
//  Music_Swift
//
//  Created by zhangfei on 15/08/17.
//  Copyright © 2015年 zhangfei. All rights reserved.
//

import UIKit

class PlayMusicController: UIViewController {

    //单例方法
    static var sharePlayMusicController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("playID") as! PlayMusicController
    

   

    //声明属性
    var index: Int!
    var currtentIndex: Int!
    var currtentMusic: Music!
    
    
    //UI界面属性
    @IBOutlet weak var nameLabel: UILabel!
    
    @IBOutlet weak var singerLabel: UILabel!
    
    @IBOutlet weak var imgView: UIImageView!
    
    @IBOutlet weak var tableBackImage: UIImageView!
    
    @IBOutlet weak var tableView: UITableView!
    
    //UI界面点击事件
    @IBAction func disBtnAction(sender: UIButton) {
        dismissViewControllerAnimated(true, completion: nil)
    }
    
    @IBAction func durtionSliderAction(sender: UISlider) {
        
    }
    
    @IBAction func volumeSliderAction(sender: UISlider) {
        
        PlayerHelper.sharePlayerHelper.volumeWithVolumeSliderValue(sender.value)
        
    }
    
    @IBAction func popBtnAction(sender: UIButton) {
        
        currtentIndex = currtentIndex - 1
        if currtentIndex < 0 {
            currtentIndex = 199
        }
        self.preparePlayMusic()
        
    }
    
    @IBAction func playOrPauseBtnAction(sender: UIButton) {
        
        if PlayerHelper.sharePlayerHelper.isPlaying == true {
            PlayerHelper.sharePlayerHelper.pause()
        }else {
            PlayerHelper.sharePlayerHelper.play()
        }
        
    }
    
    @IBAction func nextBtnAction(sender: UIButton) {
        
        currtentIndex = currtentIndex + 1
        
        if currtentIndex > DataManager.shareDataManager.allDataArray().count - 1 {
            currtentIndex = 0
        }
        self.preparePlayMusic()
        
    }
    
}


extension PlayMusicController {
    
    
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        
       print(index)
        if index == -1 {
            return
        }
        
        if currtentIndex == index {
            return
        }
        
        currtentIndex = index!
        self.preparePlayMusic()
    }
    
    func preparePlayMusic() ->Void {
        
        self.currtentMusic = DataManager.shareDataManager.allDataArray()[currtentIndex]
        
        self.loadViewInfo()
       PlayerHelper.sharePlayerHelper.playMusicWithURL(NSURL(string: currtentMusic.mp3Url)!)
    }
    
    func loadViewInfo() ->Void {
        
        self.nameLabel.text = currtentMusic.name
        self.singerLabel.text = currtentMusic.singer
        let currentUrl = NSURL(string: currtentMusic.picUrl)
        self.imgView.sd_setImageWithURL(currentUrl)
    
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.currtentIndex = -2
        
        // Do any additional setup after loading the view.
    }
    

}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM