这几天闲着也是闲着,学习一下Swift的。于是到开源社区Download了个OC版的音乐播放器,练练手,在这里发扬开源精神。

希望对大家有帮助!

这个DEMO里。使用到了

AudioPlayer(对音频封装的库)

FreeStreamer(老外写的音频高效处理库)

LKDBHelper(将数据模型直接写到数据库中的库)

AFNetworking (网络库)

SDWebImage (图片获取库)

另外。我也把OC版的ProgressHUD转成了Swift版本号的HYBProgressHUD,希望对大家实用啊!

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd29haWZlbjMzNDQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd29haWZlbjMzNDQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd29haWZlbjMzNDQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

眼下仅仅实现了这几个简单的功能,希望有时间且爱研究的同学,追加很多其它的功能再开源出来哦!

以下我说一下封装的网络请求类:

  1. import Foundation
  2.  
  3. /// 请求成功与失败的回调
  4. typealias requestSuccessCloser = (responseObject: AnyObject?) ->Void
  5. typealias failCloser = (error: NSError?
  6.  
  7. ) ->Void
  8.  
  9. ///
  10. /// 描写叙述:网络请求基础类,全部GET请求方式都是以GET开头的类方法,POST请求方式会以POST开头命名类方法
  11. ///
  12. /// 作者:huangyibiao
  13. class HYBBaseRequest: NSObject {
  14. struct BaseURL {
  15. static var baseURL: String = kServerBase
  16. }
  17.  
  18. ///
  19. /// 描写叙述:解析JSON数据
  20. ///
  21. /// 參数:jsonObject 网络请求获取下来数据
  22. ///
  23. /// 返回:假设解析成功。返回字典,否则返回nil
  24. class func parseJSON(#jsonObject: AnyObject?
  25.  
  26. ) ->NSDictionary? {
  27. if let result = jsonObject as? NSDictionary {
  28. return result
  29. }
  30. return nil
  31. }
  32.  
  33. ///
  34. /// 描写叙述: GET请求方式
  35. ///
  36. /// 參数: serverPath --请求路径,不包括基础路径
  37. /// success --请求成功时的回调闭包
  38. /// fail --请求失败时的回调闭包
  39. ///
  40. /// 返回: AFHTTPRequestOperation类型对象,外部能够通过引用此对象实例,在须要取消请求时。调用cancel()方法
  41. class func GETRequest(serverPath: String, success: requestSuccessCloser, fail: failCloser) ->AFHTTPRequestOperation {
  42. var op = manager().GET(serverPath, parameters: nil, success: { (op, responseObject) -> Void in
  43. success(responseObject: responseObject)
  44. }, failure: { (op, error) -> Void in
  45. fail(error: error)
  46. })
  47. return op
  48. }
  49.  
  50. class func downloadFile(serverPath: String, success: requestSuccessCloser, fail: failCloser) ->AFHTTPRequestOperation {
  51. var op = AFHTTPRequestOperation(request: NSURLRequest(URL: NSURL(string: String(format: "%@%@", kServeBase1, serverPath))))
  52. op.setCompletionBlockWithSuccess({ (requestOp, responseObject) -> Void in
  53. success(responseObject: responseObject)
  54. }, failure: { (requestOP, error) -> Void in
  55. fail(error: error)
  56. })
  57. op.start()
  58. return op
  59. }
  60.  
  61. ///
  62. /// 私有方法区
  63. ///
  64. private class func manager() ->AFHTTPRequestOperationManager {
  65. var manager = AFHTTPRequestOperationManager(baseURL: NSURL(string: BaseURL.baseURL))
  66.  
  67. manager.requestSerializer.setValue("application/json", forHTTPHeaderField: "Accept")
  68. manager.requestSerializer.setValue("application/json", forHTTPHeaderField: "content-type")
  69. manager.requestSerializer.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Accept")
  70. manager.requestSerializer.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
  71.  
  72. // 设置响应头支持的格式
  73. manager.responseSerializer.acceptableContentTypes = NSSet(array: ["application/json", "application/javascript", "application/lrc", "application/x-www-form-urlencoded"])
  74. return manager
  75. }
  76. }

由于资源类型不同,所以要在请求头加入支持的格式才干訪问到资源哦。

以下是封装歌词显示的UI,这里没有细化对时间的把握,仅仅是粗略实现功能。有时间的同学能够对播放进度把握得更好。

  1. import Foundation
  2.  
  3. ///
  4. /// 描写叙述: 显示歌词控件
  5. ///
  6. /// 作者: huangyibiao
  7. class HYBSongLRCView: UIView {
  8. private var scrollView: UIScrollView!
  9. private var keyArray = NSMutableArray()
  10. private var titleArray = NSMutableArray()
  11. private var lineLabelArray = NSMutableArray()
  12. private var currentPlayingLineTime: float_t = 0.0
  13.  
  14. ///
  15. /// 重写父类的方法
  16. ///
  17. override init(frame: CGRect) {
  18. super.init(frame: frame)
  19.  
  20. self.scrollView = UIScrollView(frame: CGRectMake(0, 10, self.width(), self.height() - 20))
  21. // 临时关闭可交互功能
  22. self.scrollView.userInteractionEnabled = false
  23. self.addSubview(self.scrollView)
  24. }
  25.  
  26. required init(coder aDecoder: NSCoder) {
  27. fatalError("init(coder:) has not been implemented")
  28. }
  29.  
  30. ///
  31. /// public方法区
  32. ///
  33.  
  34. ///
  35. /// 描写叙述:解析歌词
  36. ///
  37. /// 參数:lrcPath LRC歌词的路径
  38. func parseSong(lrcPath: String) {
  39. self.keyArray.removeAllObjects()
  40. self.titleArray.removeAllObjects()
  41.  
  42. var content = NSString(contentsOfFile: lrcPath, encoding: NSUTF8StringEncoding, error: nil)
  43. var array = content.componentsSeparatedByString("\n")
  44. // 解析每一行
  45. for line in array {
  46. if let lrcLine = line as?
  47.  
  48. NSString {
  49. if lrcLine.length != 0 {
  50. self.parseLRCLine(lrcLine)
  51. }
  52. }
  53. }
  54.  
  55. self.bubbleSortLrcLines(self.keyArray)
  56.  
  57. self.scrollView.contentOffset = CGPointZero
  58. self.scrollView.contentSize = CGSizeMake(scrollView.width(), CGFloat(keyArray.count * 25))
  59. self.configureLRCLineLabels()
  60. }
  61.  
  62. ///
  63. /// 描写叙述:移除显示歌词的标签
  64. func removeAllSubviewsInScrollView() {
  65. for subview in self.scrollView.subviews {
  66. subview.removeFromSuperview()
  67. }
  68.  
  69. self.lineLabelArray.removeAllObjects()
  70. }
  71.  
  72. ///
  73. /// 描写叙述:移除之前的歌词数据
  74. func clearLRCContents() {
  75. self.keyArray.removeAllObjects()
  76. self.titleArray.removeAllObjects()
  77. }
  78.  
  79. ///
  80. /// 描写叙述:指定歌词播放的时间,会依据时间滚动到相应的歌词行
  81. ///
  82. /// 參数:time 歌词行播放的时间
  83. func moveToLRCLine(#time: NSString) {
  84. if self.keyArray.count != 0 {
  85. var currentTimeValue = self.timeToFloat(time)
  86.  
  87. var index = 0
  88. var hasFound = false
  89. for index = 0; index < self.keyArray.count; index++ {
  90. if let lrcTime = self.keyArray[index] as? NSString {
  91. var tmpTimeValue = self.timeToFloat(lrcTime)
  92. if fabs(tmpTimeValue - currentTimeValue) <= fabs(0.000000001) {
  93. hasFound = true
  94. currentPlayingLineTime = tmpTimeValue
  95. break
  96. }
  97. }
  98. }
  99.  
  100. if hasFound || (!hasFound && currentPlayingLineTime < currentTimeValue) {
  101. if index < self.lineLabelArray.count {
  102. if let label = self.lineLabelArray[index] as?
  103.  
  104. UILabel {
  105. updateCurrentTimeLRC(label)
  106. self.scrollView.setContentOffset(CGPointMake(0.0, 25.0 * CGFloat(index)),
  107. animated: true)
  108. }
  109. }
  110. }
  111. }
  112. }
  113.  
  114. ///
  115. /// private方法区
  116. ///
  117.  
  118. ///
  119. /// 描写叙述:解析歌词行
  120. ///
  121. /// 參数:lrcLine 该行歌词
  122. private func parseLRCLine(lrcLine: NSString) {
  123. if lrcLine.length == 0 {
  124. return
  125. }
  126.  
  127. var array = lrcLine.componentsSeparatedByString("\n")
  128. for var i = 0; i < array.count; i++ {
  129. var tempString = array[i] as NSString
  130. var lineArray = tempString.componentsSeparatedByString("]")
  131.  
  132. for var j = 0; j < lineArray.count - 1; j++ {
  133. var line = lineArray[j] as NSString
  134.  
  135. if line.length > 8 {
  136. var str1 = tempString.substringWithRange(NSMakeRange(3, 1))
  137. var str2 = tempString.substringWithRange(NSMakeRange(6, 1))
  138.  
  139. if str1 == ":" && str2 == "." {
  140. var lrc = lineArray.last as NSString
  141. var time = lineArray[j].substringWithRange(NSMakeRange(1, 8)) as NSString
  142. // 时间作为KEY
  143. self.keyArray.addObject(time.substringToIndex(5))
  144. // 歌词会为值
  145. self.titleArray.addObject(lrc)
  146. }
  147. }
  148. }
  149. }
  150. }
  151.  
  152. ///
  153. /// 描写叙述:对全部歌词行进行冒泡排序
  154. ///
  155. /// 參数:array 要进行冒泡排序的数组
  156. private func bubbleSortLrcLines(array: NSMutableArray) {
  157. for var i = 0; i < array.count; i++ {
  158. var firstValue = self.timeToFloat(array[i] as NSString)
  159.  
  160. for var j = i + 1; j < array.count; j++ {
  161. var secondValue = self.timeToFloat(self.keyArray[j] as NSString)
  162.  
  163. if firstValue > secondValue {
  164. array.exchangeObjectAtIndex(i, withObjectAtIndex: j)
  165. self.titleArray.exchangeObjectAtIndex(i, withObjectAtIndex: j)
  166. }
  167.  
  168. }
  169. }
  170. }
  171.  
  172. ///
  173. /// 描写叙述:把时间字符串转换成浮点值
  174. ///
  175. /// 參数:time 时间字符串,格式为:"05:11"
  176. private func timeToFloat(time: NSString) ->float_t {
  177. var array = time.componentsSeparatedByString(":")
  178.  
  179. var result: NSString = "\(array[0])"
  180. if array.count >= 2 {
  181. result = "\(array[0]).\(array[1])"
  182. }
  183.  
  184. return result.floatValue
  185. }
  186.  
  187. ///
  188. /// 描写叙述:创建显示歌词的标签
  189. private func configureLRCLineLabels() {
  190. self.removeAllSubviewsInScrollView()
  191.  
  192. for var i = 0; i < titleArray.count; i++ {
  193. var title = titleArray[i] as String
  194. var label = UIMaker.label(CGRectMake(0.0,
  195. 25.0 * CGFloat(i) + scrollView.height() / 2.0,
  196. scrollView.width(),
  197. 25.0),
  198. title: title)
  199. label.textColor = UIColor.lightGrayColor()
  200. label.font = UIFont.systemFontOfSize(14.0)
  201.  
  202. scrollView.addSubview(label)
  203. lineLabelArray.addObject(label)
  204. }
  205. }
  206.  
  207. ///
  208. /// 描写叙述:更新当前显示的歌词
  209. private func updateCurrentTimeLRC(currentLabel: UILabel) {
  210. for label in self.lineLabelArray {
  211. if let item = label as? UILabel {
  212. if item == currentLabel {
  213. item.textColor = kNavColor
  214. item.font = UIFont.boldSystemFontOfSize(16.0)
  215. } else {
  216. item.textColor = UIColor.lightGrayColor()
  217. item.font = UIFont.systemFontOfSize(14.0)
  218. }
  219. }
  220. }
  221. }
  222. }

Swift版的HYBProgressHUD控件,调用方式是很easy的。使用的都是公开的类方法调用方式:

  1. import Foundation
  2. import UIKit
  3.  
  4. ///
  5. /// @brief 样式
  6. enum HYBProgressHUDStyle {
  7. case BlackHUDStyle /// 黑色风格
  8. case WhiteHUDStyle /// 白色风格
  9. }
  10.  
  11. ///
  12. /// @brief 定制显示通知的视图HUD
  13. /// @author huangyibiao
  14. class HYBProgressHUD: UIView {
  15. var hud: UIToolbar?
  16.  
  17. var spinner: UIActivityIndicatorView?
  18. var imageView: UIImageView?
  19.  
  20. var titleLabel: UILabel?
  21.  
  22. ///
  23. /// private 属性
  24. ///
  25. private let statusFont = UIFont.boldSystemFontOfSize(16.0)
  26. private var statusColor: UIColor!
  27. private var spinnerColor: UIColor!
  28. private var bgColor: UIColor!
  29. private var successImage: UIImage!
  30. private var errorImage: UIImage!
  31.  
  32. ///
  33. /// @brief 单例方法,仅仅同意内部调用
  34. private class func sharedInstance() ->HYBProgressHUD {
  35. struct Instance {
  36. static var onceToken: dispatch_once_t = 0
  37. static var instance: HYBProgressHUD?
  38. }
  39.  
  40. dispatch_once(&Instance.onceToken, { () -> Void in
  41. Instance.instance = HYBProgressHUD(frame: UIScreen.mainScreen().bounds)
  42. Instance.instance?
  43.  
  44. .setStyle(HYBProgressHUDStyle.WhiteHUDStyle)
  45. })
  46.  
  47. return Instance.instance!
  48. }
  49.  
  50. override init(frame: CGRect) {
  51. super.init(frame: frame)
  52.  
  53. hud = nil
  54. spinner = nil
  55. imageView = nil
  56. titleLabel = nil
  57. self.alpha = 0.0
  58. }
  59.  
  60. required init(coder aDecoder: NSCoder) {
  61. fatalError("init(coder:) has not been implemented")
  62. }
  63.  
  64. ///
  65. /// 公开方法
  66. ///
  67.  
  68. /// 显示信息
  69. class func show(status: String) {
  70. sharedInstance().configureHUD(status, image: nil, isSpin: true, isHide: false)
  71. }
  72.  
  73. /// 显示成功信息
  74. class func showSuccess(status: String) {
  75. sharedInstance().configureHUD(status, image: sharedInstance().successImage, isSpin: false, isHide: true)
  76. }
  77.  
  78. /// 显示出错信息
  79. class func showError(status: String) {
  80. sharedInstance().configureHUD(status, image: sharedInstance().errorImage, isSpin: false, isHide: true)
  81. }
  82.  
  83. /// 隐藏
  84. class func dismiss() {
  85. sharedInstance().hideHUD()
  86. }
  87.  
  88. ///
  89. /// 私有方法
  90. ///
  91.  
  92. ///
  93. /// @brief 创建并配置HUD
  94. private func configureHUD(status: String?, image: UIImage?
  95.  
  96. , isSpin: Bool, isHide: Bool) {
  97. configureProgressHUD()
  98.  
  99. /// 标题
  100. if status == nil {
  101. titleLabel!.hidden = true
  102. } else {
  103. titleLabel!.text = status!
  104. titleLabel!.hidden = false
  105. }
  106. // 图片
  107. if image == nil {
  108. imageView?.hidden = true
  109. } else {
  110. imageView?.hidden = false
  111. imageView?.image = image
  112. }
  113.  
  114. // spin
  115. if isSpin {
  116. spinner?.startAnimating()
  117. } else {
  118. spinner?.stopAnimating()
  119. }
  120.  
  121. rotate(nil)
  122. addjustSize()
  123. showHUD()
  124.  
  125. if isHide {
  126. NSThread.detachNewThreadSelector("hideWhenTimeout", toTarget: self, withObject: nil)
  127. }
  128. }
  129.  
  130. ///
  131. /// @brief 设置风格样式,默认使用的是黑色的风格,假设须要改成白色的风格,请在内部改动样式
  132. private func setStyle(style: HYBProgressHUDStyle) {
  133. switch style {
  134. case .BlackHUDStyle:
  135. statusColor = UIColor.whiteColor()
  136. spinnerColor = UIColor.whiteColor()
  137. bgColor = UIColor(white: 0, alpha: 0.8)
  138. successImage = UIImage(named: "ProgressHUD.bundle/success-white.png")
  139. errorImage = UIImage(named: "ProgressHUD.bundle/error-white.png")
  140. break
  141. case .WhiteHUDStyle:
  142. statusColor = UIColor.whiteColor()
  143. spinnerColor = UIColor.whiteColor()
  144. bgColor = UIColor(red: 192.0 / 255.0, green: 37.0 / 255.0, blue: 62.0 / 255.0, alpha: 1.0)
  145. successImage = UIImage(named: "ProgressHUD.bundle/success-white.png")
  146. errorImage = UIImage(named: "ProgressHUD.bundle/error-white.png")
  147. break
  148. default:
  149. break
  150. }
  151. }
  152.  
  153. ///
  154. /// @brief 获取窗体window
  155. private func getWindow() ->UIWindow {
  156. if let delegate: UIApplicationDelegate = UIApplication.sharedApplication().delegate {
  157. if let window = delegate.window {
  158. return window!
  159. }
  160. }
  161.  
  162. return UIApplication.sharedApplication().keyWindow
  163. }
  164.  
  165. ///
  166. /// @brief 创建HUD
  167. private func configureProgressHUD() {
  168. if hud == nil {
  169. hud = UIToolbar(frame: CGRectZero)
  170. hud?.barTintColor = bgColor
  171. hud?.translucent = true
  172. hud?.layer.cornerRadius = 10
  173. hud?.layer.masksToBounds = true
  174.  
  175. /// 监听设置方向变化
  176. NSNotificationCenter.defaultCenter().addObserver(self,
  177. selector: "rotate:",
  178. name: UIDeviceOrientationDidChangeNotification,
  179. object: nil)
  180. }
  181.  
  182. if hud!.superview == nil {
  183. getWindow().addSubview(hud!)
  184. }
  185.  
  186. if spinner == nil {
  187. spinner = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
  188. spinner!.color = spinnerColor
  189. spinner!.hidesWhenStopped = true
  190. }
  191.  
  192. if spinner!.superview == nil {
  193. hud!.addSubview(spinner!)
  194. }
  195.  
  196. if imageView == nil {
  197. imageView = UIImageView(frame: CGRectMake(0, 0, 28, 28))
  198. }
  199.  
  200. if imageView!.superview == nil {
  201. hud!.addSubview(imageView!)
  202. }
  203.  
  204. if titleLabel == nil {
  205. titleLabel = UILabel(frame: CGRectZero)
  206. titleLabel?.backgroundColor = UIColor.clearColor()
  207. titleLabel?.font = statusFont
  208. titleLabel?
  209.  
  210. .textColor = statusColor
  211. titleLabel?.baselineAdjustment = UIBaselineAdjustment.AlignCenters
  212. titleLabel?.numberOfLines = 0
  213. titleLabel?.textAlignment = NSTextAlignment.Center
  214. titleLabel?
  215.  
  216. .adjustsFontSizeToFitWidth = false
  217. }
  218.  
  219. if titleLabel!.superview == nil {
  220. hud!.addSubview(titleLabel!)
  221. }
  222. }
  223.  
  224. ///
  225. /// @brief 释放资源
  226. private func destroyProgressHUD() {
  227. NSNotificationCenter.defaultCenter().removeObserver(self, name: UIDeviceOrientationDidChangeNotification, object: nil)
  228.  
  229. titleLabel?.removeFromSuperview()
  230. titleLabel = nil
  231.  
  232. spinner?
  233.  
  234. .removeFromSuperview()
  235. spinner = nil
  236.  
  237. imageView?.removeFromSuperview()
  238. imageView = nil
  239.  
  240. hud?
  241.  
  242. .removeFromSuperview()
  243. hud = nil
  244. }
  245.  
  246. ///
  247. /// @brief 设置方向变化通知处理
  248. func rotate(sender: NSNotification?) {
  249. var rotation: CGFloat = 0.0
  250. switch UIApplication.sharedApplication().statusBarOrientation {
  251. case UIInterfaceOrientation.Portrait:
  252. rotation = 0.0
  253. break
  254. case .PortraitUpsideDown:
  255. rotation = CGFloat(M_PI)
  256. break
  257. case .LandscapeLeft:
  258. rotation = -CGFloat(M_PI_2)
  259. break
  260. case .LandscapeRight:
  261. rotation = CGFloat(M_PI_2)
  262. break
  263. default:
  264. break
  265. }
  266.  
  267. hud?.transform = CGAffineTransformMakeRotation(rotation)
  268. }
  269.  
  270. ///
  271. /// @brief 调整大小
  272. private func addjustSize() {
  273. var rect = CGRectZero
  274. var width: CGFloat = 100.0
  275. var height: CGFloat = 100.0
  276.  
  277. /// 计算文本大小
  278. if titleLabel!.text != nil {
  279. var style = NSMutableParagraphStyle()
  280. style.lineBreakMode = NSLineBreakMode.ByCharWrapping
  281. var attributes = [NSFontAttributeName: statusFont, NSParagraphStyleAttributeName: style.copy()]
  282. var option = NSStringDrawingOptions.UsesLineFragmentOrigin
  283. var text: NSString = NSString(CString: titleLabel!.text!.cStringUsingEncoding(NSUTF8StringEncoding)!,
  284. encoding: NSUTF8StringEncoding)
  285. rect = text.boundingRectWithSize(CGSizeMake(160, 260), options: option, attributes: attributes, context: nil)
  286. rect.origin.x = 12
  287. rect.origin.y = 66
  288.  
  289. width = rect.size.width + 24
  290. height = rect.size.height + 80
  291.  
  292. if width < 100 {
  293. width = 100
  294. rect.origin.x = 0
  295. rect.size.width = 100
  296. }
  297. }
  298.  
  299. hud!.center = CGPointMake(kScreenWidth / 2, kScreenHeight / 2)
  300. hud!.bounds = CGRectMake(0, 0, width, height)
  301.  
  302. var h = titleLabel!.text == nil ? height / 2 : 36
  303. imageView!.center = CGPointMake(width / 2, h)
  304. spinner!.center = CGPointMake(width / 2, h)
  305.  
  306. titleLabel!.frame = rect
  307. }
  308.  
  309. ///
  310. /// @brief 显示
  311. private func showHUD() {
  312. if self.alpha == 0.0 {
  313. self.alpha = 1.0
  314.  
  315. hud!.alpha = 0.0
  316. self.hud!.transform = CGAffineTransformScale(self.hud!.transform, 1.4, 1.4)
  317. UIView.animateKeyframesWithDuration(0.15,
  318. delay: 0.0,
  319. options: UIViewKeyframeAnimationOptions.AllowUserInteraction,
  320. animations: { () -> Void in
  321. self.hud!.transform = CGAffineTransformScale(self.hud!.transform, 1.0 / 1.4, 1.0 / 1.4)
  322. self.hud!.alpha = 1.0
  323. }, completion: { (isFinished) -> Void in
  324. })
  325. }
  326. }
  327.  
  328. ///
  329. /// @brief 隐藏
  330. private func hideHUD() {
  331. if self.alpha == 1.0 {
  332. UIView.animateKeyframesWithDuration(0.2,
  333. delay: 0.0,
  334. options: UIViewKeyframeAnimationOptions.AllowUserInteraction,
  335. animations: { () -> Void in
  336. self.hud!.transform = CGAffineTransformScale(self.hud!.transform, 0.35, 0.35)
  337. self.hud!.alpha = 0.0
  338. }, completion: { (isFinished) -> Void in
  339. self.destroyProgressHUD()
  340. self.alpha = 0.0
  341. })
  342. }
  343. }
  344.  
  345. ///
  346. /// @brief 在指定时间内隐藏
  347. func hideWhenTimeout() {
  348. autoreleasepool { () -> () in
  349. var length = countElements(self.titleLabel!.text!)
  350. var sleepTime: NSTimeInterval = NSTimeInterval(length) * 0.04 + 0.5
  351. NSThread.sleepForTimeInterval(sleepTime)
  352.  
  353. self.hideHUD()
  354. }
  355. }
  356. }

剩下的部分。 就须要有耐心的同学们去研究代码了。点击这里能够下载到源码

Swift版音乐播放器(简化版)的更多相关文章

  1. Swift版音乐播放器(简化版),swift音乐播放器

    这几天闲着也是闲着,学习一下Swift的,于是到开源社区Download了个OC版的音乐播放器,练练手,在这里发扬开源精神, 希望对大家有帮助! 这个DEMO里,使用到了 AudioPlayer(对音 ...

  2. 解决ubuntu系统中firefox无法播放网页版音乐播放器音乐

    Reference: https://blog.csdn.net/h736131708/article/details/80775382 因为网页版的qq音乐或者网易云音乐都把音频换成了AAC格式,这 ...

  3. html5版 音乐播放器

    html5版本音乐播放器,支持iOS设备,案例地址:http://www.xttblog.com/?p=1277 功能说明 支持iOS设备,但是iOS不支持自动下一曲,这是iOS本身限制,支持touc ...

  4. 躁!DJ 风格 Java 桌面音乐播放器

    本文适合有 Java 基础知识的人群,跟着本文可学习和运行 Java 版桌面 DJ 音乐播放器. 本文作者:HelloGitHub-秦人 HelloGitHub 推出的<讲解开源项目>系列 ...

  5. swift 音乐播放器项目-《lxy的杰伦情歌》开发实战演练

    近期准备将项目转化为OC与swift混合开发.试着写一个swift音乐播放器的demo,体会到了swift相对OC的优势所在.废话不多说.先上效果图: watermark/2/text/aHR0cDo ...

  6. Swift 3 :基于 AVAudioPlayer 的简单音乐播放器

    2017.05.22 17:46* 字数 1585 阅读 5095评论 0喜欢 8赞赏 2 https://www.jianshu.com/p/4d5c257428a1 学习ios以来差不多接近两个月 ...

  7. 基于jQuery仿QQ音乐播放器网页版代码

    基于jQuery仿QQ音乐播放器网页版代码是一款黑色样式风格的网页QQ音乐播放器样式代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="m ...

  8. Swift - 制作一个在线流媒体音乐播放器(使用StreamingKit库)

    在之前的文章中,我介绍了如何使用 AVPlayer 制作一个简单的音乐播放器(点击查看1.点击查看2).虽然这个播放器也可以播放网络音频,但其实际上是将音频文件下载到本地后再播放的. 本文演示如何使用 ...

  9. 用PHP+H5+Boostrap做简单的音乐播放器(进阶版)

    前言:之前做了一个音乐播放器(纯前端),意外的受欢迎,然后有人建议我把后台一起做了,正好也想学习后台,所以学了两天php(不要吐槽我的速度,慢工出细活嘛~)然后在之前的基础上也又完善了一些功能,所以这 ...

随机推荐

  1. Python之Pandas中Series、DataFrame实践

    Python之Pandas中Series.DataFrame实践 1. pandas的数据结构Series 1.1 Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一 ...

  2. ARP劫持处理指令集

    第一组(据传xp有效,未实验) arp -a arp -d arp -s IP地址 MAC地址 第二组(windows2008R2有效,已实验) netsh i i show in (记住其中本地连接 ...

  3. DiscuzX2.5数据库字典 值得学习

    pre_common_admincp_cmenu – 后台菜单收藏表title => ‘菜单名称’url => ‘菜单地址’sort => ’0′ COMMENT ‘菜单类型,备用’ ...

  4. day14-二分法、匿名函数、内置函数以及面向过程编程

    目录 二分法 匿名函数 内置函数 面向过程编程 二分法 二分法查找适用于数据量较大时,但是数据需要先排好顺序.主要思想是:(设查找的数组区间为array[low, high]) (1)确定该区间的中间 ...

  5. vue组件---动态组件之多标签页面

    首先看下效果图 代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> & ...

  6. ThinkPHP---拓展之jQuery的ajax

    [前言] 用Sublime开发时,推荐下载一个jQuery插件,可以智能化创建基本函数格式,支持自动生成,可以提高开发效率 (1)jQuery里ajax方法有几个? 答:有4个,分别为post.get ...

  7. php file_get_contents函数分段读取大记事本或其它文本文件

    当我们遇到文本文件体积很大时,比如超过几十M甚至几百M几G的大文件,用记事本或者其它编辑器打开往往不能成功,因为他们都需要把文件内容全部放到内存里面,这时就会发生内存溢出而打开错误,遇到这种情况我们可 ...

  8. 移动端响应式rem

    (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? ...

  9. centos下kong源码安装

    参考资料: https://docs.konghq.com/install/source/ 环境准备:操作系统 centeros7.3 1 :openssl和pcre一般系统自带,如果没有可自己安装  ...

  10. [bzoj1867][Noi1999][钉子和小球] (动态规划)

    Description Input 第1行为整数n(2<=n<=50)和m(0<=m<=n).以下n行依次为木板上从上至下n行钉子的信息,每行中‘*’表示钉子还在,‘.’表示钉 ...