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 转载就注明来源
Swift实战-QQ在线音乐(第一版)的更多相关文章
- Swift实战-QQ在线音乐(第二版)
此版本使用百度音乐接口,原因是豆瓣接口很多歌曲没办法找到歌词. 此版本添加了歌词的显示.上一曲.下一曲的实现.歌曲列表指明当前歌曲. 下面来看一下实现过程>>> 一.项目准备: 百度 ...
- Swift实战-QQ在线音乐(AppleWatch版)
1.打开项目QQMusic,然后点菜单:“File-New-Target”添加appleWatch扩展项 2.选择Swift语言,把Include Notification Scene前的勾去掉 (项 ...
- Swift实战-豆瓣电台(五)播放音乐
观看地址 http://v.youku.com/v_show/id_XNzMwODM0MzI0.html 在这节里面,我们简单学习了一下MediaPlayer的使用 引入媒体框架 import Med ...
- Andriod小项目——在线音乐播放器
转载自: http://blog.csdn.net/sunkes/article/details/51189189 Andriod小项目——在线音乐播放器 Android在线音乐播放器 从大一开始就已 ...
- Swift实战-豆瓣电台(九)简单手势控制暂停播放(全文完)
Swift实战-豆瓣电台(九)简单手势控制暂停播放 全屏清晰观看地址:http://www.tudou.com/programs/view/tANnovvxR8U/ 这节我们主要讲UITapGestu ...
- Swift实战-豆瓣电台(八)播放进度与时间
视频观看地址:http://www.tudou.com/programs/view/4mEtz8S72k0/?resourceId=399000367_06_02_99 这节主要内容是NSTimer, ...
- Swift实战-豆瓣电台(七)显示动画
youku观看地址http://v.youku.com/v_show/id_XNzMxODQzNDIw.html 这是一个很酷的动画效果.特别是数据多的时候 知识点 在单元格(Cell)显示方法中设置 ...
- Swift实战-豆瓣电台(六)视图跳转,传参及回跳
youku观看地址:http://v.youku.com/v_show/id_XNzMxMzQ3MDcy.html 要点 在ChannelController里面声明一个代理 这个代理遵循我们自定义的 ...
- 在线音乐API的研究 (Part 2.1)
本文转载于:http://www.cnblogs.com/osmondy/p/LyricApi.html 最近,在优化一个自己写的音乐播放器.主要目的是回顾.归纳,并希望能够写出一个属于自己的comm ...
随机推荐
- [Windows编程] 使用AttachThreadInput 来捕捉其它窗口的键盘输入
在一些情况下(比如屏幕软键盘或者输入法程序),自己的窗口没有输入焦点但是想要当前焦点窗口的键盘输入消息,可以使用Win32 API函数AttachThreadInput()来解决这个问题.Attach ...
- Laravel + Xdebug 时需要注意的问题
[平台环境]64bit Win7 + Wamp2.5 (php 5.5, Apache 2.4.9) [Xdebug版本]php_xdebug-2.2.5-5.5-vc11-x86_64.dll 配置 ...
- CSS3媒体查询(Media Queries)
媒体类型: all 所有设备 screen 电脑显示器 handheld 便携设备 tv 电视类型设备 print 打印用纸打印预览视图 关键字 and not(排除某种设备) only(限定某种设备 ...
- PHP入门-摘要表格处理问题
几天来学习下来.PHP和C/C++有太多的阶段似系.所以,简单的入门现在看来已经没有问题.然而,由于所选择的条目是一个高速书籍,难免有些粗糙知识.例如,下面的两个问题让我吃了一些损失. 1. 文件标签 ...
- Objective-c 类接口 (@interface) (类定义)
在Objective-c中如何定义一个类呢?我们可以使用下面的格式进行表示: @interface 类名:父类名{ 变量定义; } 方法定义: @end; 下面给出一个实例: @interface P ...
- c 对某个整数做因式分解
1 #include <stdio.h> int main(void) { int n,i; scanf("%d",&n); printf("%d=& ...
- Android操作HTTP实现和服务器通信
众所周知,Android与服务器通信通常采用HTTP通信方式和Socket通信方式,而HTTP通信方式又分get和post两种方式.至于Socket通信会在以后的博文中介绍. HTTP协议简介: HT ...
- apache基本配置
apache基本配置 apache本地虚拟域名配置
- sql差异
类别 MS SQL Server My SQL PG SQL Oracle Access 自增 identity(1,1) auto_increment ALTER TABLE 'tableNam ...
- 链接分析算法之:主题敏感PageRank
链接分析算法之:主题敏感PageRank 前面的讨论提到.PageRank忽略了主题相关性,导致结果的相关性和主题性降低,对于不同的用户,甚至有很大的差别.例如,当搜索“苹果”时,一个数码爱好 ...