Swift实战-QQ在线音乐(第一版)

//一、*项目准备

1、QQ音乐App 界面素材:(我使用PP助手,将QQ音乐App备份,解压ipa文件 即可得到里面的图片素材)

2、豆瓣电台接口:"http://douban.fm/j/mine/playlist?channel=1"

//二、*界面布局
使用Xcode新建一个Single View Application项目,选择Swift语言。

导入素材图片、在默认的ViewController视图进行以下布局。

界面控件不多,如图将几个关键控件布局就可以了。

//三、*背景模糊特效
布局好就马上要写代码了,写完将会看到一个非常漂亮的效果

首先将控件关联到ViewController

1   @IBOutlet weak var photoBorderView: UIView!
2     @IBOutlet weak var progressSlider: UISlider!
3     @IBOutlet weak var backgroundImageView: UIImageView!
4     @IBOutlet weak var photo: UIImageView!
5     @IBOutlet weak var playButton:UIButton!
6     @IBOutlet weak var titleLabel: UILabel!
7     @IBOutlet weak var artistLabel:UILabel!
8     @IBOutlet weak var playTimeLabel:UILabel!
9     @IBOutlet weak var allTimeLabel:UILabel!   

在viewDidLoad方法里,写上模糊特效

 override func viewDidLoad() {
        super.viewDidLoad()
        //将图像变圆形
        photo.layer.cornerRadius=self.photo.frame.size.width/2.0
        photo.clipsToBounds=true
        photoBorderView.layer.cornerRadius=self.photoBorderView.frame.size.width/2.0
        photoBorderView.clipsToBounds=true
        //模糊效果
        let blurEffect=UIBlurEffect(style: UIBlurEffectStyle.Dark)
        let blureView=UIVisualEffectView(effect: blurEffect)
        blureView.frame=self.view.frame
        backgroundImageView.addSubview(blureView)
        //设置slider图标
        progressSlider.setMinimumTrackImage(UIImage(named: "player_slider_playback_left.png"), forState: UIControlState.Normal)
        progressSlider.setMaximumTrackImage(UIImage(named: "player_slider_playback_right.png"), forState: UIControlState.Normal)
        progressSlider.setThumbImage(UIImage(named: "player_slider_playback_thumb.png"), forState: UIControlState.Normal)
}

运行一下,看看是不是很漂亮。

//四*让图片旋转起来

先把下面这个方法写上,想看到效果就在viewDidLoad()方法里加上 rotationAnimation()进行调用。

 //图片旋转动画
    func rotationAnimation(){
        let rotation=CABasicAnimation(keyPath: "transform.rotation.z")
        rotation.timingFunction=CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
        rotation.toValue=2*M_PI
        rotation.duration=16
        rotation.repeatCount=HUGE
        rotation.autoreverses=false
        photo.layer.addAnimation(rotation, forKey: "rotationAnimation")
    }

//五*弹出播放列表页

新建一个PlayListView.swift和PlayListView.xib并将xib的class关联到PlayListView

将PlayListView.xib进行布局

//弹出方法

 //显示
    func showPlayListView(){
        UIApplication.sharedApplication().keyWindow?.addSubview(self)
        //动画从下向上进入
        var vbFrame:CGRect = self.viewBackground.frame
        vbFrame.origin.y=vbFrame.origin.y+vbFrame.size.height
        self.viewBackground.frame=vbFrame
        UIView.animateWithDuration(0.15, animations: { () -> Void in
            var vbFrame:CGRect = self.viewBackground.frame
            vbFrame.origin.y=vbFrame.origin.y-vbFrame.size.height
            self.viewBackground.frame=vbFrame
        });
    }

//关闭方法(将关闭按钮,和viewTouch的点击事件,关联此方法)

 //关闭
    @IBAction func closePlayListView(sender: AnyObject) {
        self.removeFromSuperview()
    }

//弹出我关闭方法都写好了,下面就在ViewController页,调用此视图让其弹出来

 @IBAction func showPlayList(sender: UIButton) {
        NSLog("----click---")
        var playList:PlayListView=NSBundle.mainBundle().loadNibNamed("PlayListView", owner: self, options: nil).last as PlayListView
        playList.showPlayListView()
    }

//六、请求网络数据

请求使用到一个封装类:HttpProtocol.swift

import UIKit

protocol HttpProtocol{
    func didRecieveResults(results:NSDictionary)
}

class HttpController:NSObject{

    var delegate:HttpProtocol?

    func onSearch(url:String){
        NSLog("请求地址:%@", url)
        var nsUrl:NSURL=NSURL(string:url)!
        var request:NSURLRequest=NSURLRequest(URL:nsUrl)
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response:NSURLResponse!,data:NSData!,error:NSError!)->Void in
            if (data != nil){
                var jsonResult:NSDictionary=NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
                self.delegate?.didRecieveResults(jsonResult)
            }
        })
    }
}

新建一个实体类Song.swift用来存放请求的数据

import Foundation
class Song: NSObject {
    var adtype:NSNumber = 0.0
    var aid:NSString = ""
    var album:NSString = ""
    var albumtitle:NSString = ""
    var artist:NSString = ""
    var company:NSString = ""
    var kbps:NSNumber = 0.0
    var length:NSNumber = 0.0
    var like:NSNumber = 0.0
    var monitor_url:NSString = ""
    var picture:NSString = ""
    var public_time:NSString = ""
    var rating_avg:NSString = ""
    var sha256:NSString = ""
    var sid:NSString = ""
    var songlists_count:NSNumber = 0.0
    var ssid:NSString = ""
    var subtype:NSString = ""
    var title:NSString = ""
    var url:NSString = ""
}

将请求的数据转化了实体集合

  var eHttp:HttpController = HttpController()
 //请求网络数据
        eHttp.delegate=self
        eHttp.onSearch("http://douban.fm/j/mine/playlist?channel=1")//华语
  //请求网络数据结果
    func didRecieveResults(results:NSDictionary){
        NSLog("请求到的数据:%@", results)
        if (results["song"] != nil) {
            let resultData:NSArray = results["song"] as NSArray
            let list:NSMutableArray = NSMutableArray()

            for(var index:Int=0;index<resultData.count;index++){
                var dic:NSDictionary = resultData[index] as NSDictionary
                var song:Song=Song()
                song.setValuesForKeysWithDictionary(dic as NSDictionary)
                list.addObject(song)
            }
            self.tableData=list
            self.setCurrentSong(list[0] as Song)
        }
    }

//七、*将请求后的第1条数据设置为当前将要播发的歌曲

绑定当前歌曲信息

  //设置当前播放的音乐
    func setCurrentSong(curSong:Song){
        currentSong=curSong
        photo.image=getImageWithUrl(currentSong.picture)
        backgroundImageView.image=photo.image
        titleLabel.text=currentSong.title
        artistLabel.text=currentSong.artist
        playButton.selected=false
        playTimeLabel.text="00:00"
        self.progressSlider.value=0.0
        self.rotationAnimation()
    }

//八、*播放音乐

  self.audioPlayer.stop()
        self.audioPlayer.contentURL=NSURL(string:currentSong.url)
        timer?.invalidate()
        timer=NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "updateTime", userInfo: nil, repeats: true)
 @IBAction func playButtonClick(sender: UIButton) {
        if sender.selected {
            //暂停播放
            self.audioPlayer.pause()
            pauseLayer(photo.layer)
        }else{
            //开始/继续播放
            self.audioPlayer.play()
            resumeLayer(photo.layer)
        }
        sender.selected = !sender.selected
    }

    //更新播放时间
    func updateTime(){
        let c=audioPlayer.currentPlaybackTime
         // audioPlayer.endPlaybackTime
        if c>0.0 {
            let t=audioPlayer.duration
            let p:CFloat=CFloat(c/t)
            progressSlider.value=p;
            let all:Int=Int(c)//共多少秒
            let m:Int=all % 60//秒
            let f:Int=Int(all/60)//分
            var time=NSString(format:"%02d:%02d",f,m)
            playTimeLabel.text=time
        }
    }

//九、*当点击播放或暂停时,需要将图片的动画动起来或停止动画

使用到以下两个方法

//停止Layer上面的动画
    func pauseLayer(layer:CALayer){
        var pausedTime:CFTimeInterval=layer.convertTime(CACurrentMediaTime(), fromLayer: nil)
        layer.speed=0.0
        layer.timeOffset=pausedTime
    }

    //继续Layer上面的动画
    func resumeLayer(layer:CALayer){
        var pausedTime:CFTimeInterval = layer.timeOffset
        layer.speed=1.0
        layer.timeOffset=0.0
        layer.beginTime=0.0
        var timeSincePause:CFTimeInterval=layer.convertTime(CACurrentMediaTime(), fromLayer: nil)-pausedTime
        layer.beginTime=timeSincePause
    }

最终效果:

源码下载地址:http://download.csdn.net/detail/fangwulongtian/8565487

原文出自:http://www.cnblogs.com/wuxian/p/4394094.html 转载就注明来源

时间: 2024-11-09 00:36:08

Swift实战-QQ在线音乐(第一版)的相关文章

Swift实战-QQ在线音乐(第二版)

此版本使用百度音乐接口,原因是豆瓣接口很多歌曲没办法找到歌词. 此版本添加了歌词的显示.上一曲.下一曲的实现.歌曲列表指明当前歌曲. 下面来看一下实现过程>>> 一.项目准备: 百度音乐国语歌曲列表Api接口: http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.song.getSmartSongList&page_no=1&page_size=50&scene_id=42&

Swift实战-QQ在线音乐(AppleWatch版)

1.打开项目QQMusic,然后点菜单:“File-New-Target”添加appleWatch扩展项 2.选择Swift语言,把Include Notification Scene前的勾去掉 (项目暂时不需要做ios端的通知) 3.在 WatchKit Extension的Compile Sources 中添加QQMusic项目的需要使用的类文件 4.在QQMusic WatchKit Extension包的Images.xcassets里添加资源图片 并且在QQMusic WatchKit

零基础Swift实战开发从入门到精通(4大项目实战、酷跑熊猫、百度音乐、足球游戏等)

第一部分:Swift基础语法 第1节:变量 第2节:常量 第3节:使用PlayRound编写Swift程序 第4节:类型检查与推断 第5节:类型别名 第6节:计算器 第二部分:字符和字符串 第1节:字符(Characters) 第2节:字符串-定义 第三部分:数据类型(DataType) 第1节:整型(int.Uint) 第2节:浮点数 第3节:Bool 第四部分:数据类型转换 第1节字符串转换数字类型 第2节数字类型转换字符串 第3节:数字类型之间转换 更多............ 项目实战一

零基础Swift实战开发视频教程_从入门到精通

零基础Swift实战开发从入门到精通(4大项目实战.酷跑熊猫.百度音乐.足球游戏等)适合人群:初级课时数量:50课时更新程度:86%用到技术:Swift涉及项目:酷跑熊猫.百度音乐.足球游戏咨询qq:1840215592零基础Swift实战开发视频教程采用基础+项目的方式进行讲解,通过基础的学习,可以完全掌握Swift基本语法应用,并结合4个项目进行开发,学员能在最短的时间内掌握开发的各项技能. 零基础Swift实战开发从入门到精通详细查看:http://www.ibeifeng.com/goo

在线音乐迎来大变局 掘金粉丝各出奇招

在线音乐在2016年将真正迎来其十年孕育期后的大爆发,在版权最严令的利好下,模式之变将更深层次的在粉丝经济下全面展开,而谁能真正让粉丝在长期的共享经济熏陶下,乐于慷慨解囊. 文/张书乐 据媒体报道,10日,多米音乐宣布获得华谊.磐石.七匹狼及喜之郎联合投资.同时,多米音乐宣布与中国移动旗下全资子公司咪咕文化达成合作,除了在音乐领域开展线上线下深度捆绑合作外,还将在视频.阅读.游戏.动漫各方面为粉丝提供全方位的服务,探索在线音乐新的盈利模式. 这是继网易云音乐.QQ音乐.百度音乐等多个平台之后,又

Andriod小项目——在线音乐播放器

Android在线音乐播放器 从大一开始就已经开始自学Java和Android了,到现在差不多有一年了. 终于到了开始做项目实战的阶段了.就先DIY个在线音乐播放器. 实现了以下功能: 这个播放器可以从本机电脑搭建的简易服务器里异步读取并解析json数据,播放音乐,实现音乐切换,时间显示,以及显示播放进度. 程序有三个界面,启动画面,音乐列表,播放器页面,可以通过音乐列表点击进入到播放界面. 这篇文章只大概写了一下实现的思路,描述了一些关键的地方. 文章最后还提供了源代码,可以在文章结尾处  下

拯救在线音乐?Apple Watch还要做的更多

Apple Watch的发布最终尘埃落定,不管是对天价的吐槽,还是对续航的无奈,抑或是看到时尚单品的欣喜,都只是个人的感受.而对于整个互联网.智能硬件市场乃至相关行业来说,Apple Watch带来的震动才刚刚开始.其中,对于在线音乐行业来说,或将是一个华丽的转折点. 不过实事求是地说,我们也应该看到Apple Watch本身的定位--时尚和科技真正的融合产品.而时尚只是小部分人才享有的--价格在那里放着,Apple Watch要想真正拯救在线音乐行业,或许还要做出更多努力. Apple Wat

IOS8开发视频教程之:基于Swift实战UI从入门到精通

IOS8开发视频教程之:基于Swift实战UI从入门到精通(5大项目.深入解析拉手团购项目)课程讲师:朱启文课程分类:IOS适合人群:初级课时数量:81课时用到技术:Swift.iOS8涉及项目:移动的图片案例.图片展示案例.汤姆猫案例.拉手团购案例.九宫格案例咨询QQ:1840215592 一.iOS8开发基于Swift实战UI初级课程移动的图片案例(共9课,完成9课)通过该案例,让大家掌握UIButton控件与UIImage区别使用,掌握IB连线的各类方法 tag使用,transform/f

音乐网站开发,在线音乐网站建设,DJ音乐网站制作

本公司专业承接音乐网站开发,在线音乐网站建设,DJ音乐网站制作,手机音乐网站制作开发等服务,需要的朋友可以私聊,谢谢. 支持定制,电脑版,手机版,微信版,小程序版,APP版提供一站式服务:联系QQ:2 3 6 0 2 4 8666(私聊),微信:luenmicro 电话:181-2795-0266 原文地址:http://blog.51cto.com/14052561/2313778