iOS开发拓展篇—音频处理(音乐播放器1)

简介:

说明:该系列文章通过实现一个简单的音乐播放器来介绍音频处理的相关知识点,需要重点注意很多细节的处理。

一、调整项目的结构,导入必要的素材

  调整后的项目结构如下:

二、新建两个控制器

(1)新建一个控制器,用于展示音乐文件列表界面,其继承自UITableViewController

(2)新建一个控制器,用于展示播放界面,其继承自UIViewController

(3)在storyboard中,把之前的控制器删除,换上一个导航控制器,设置tableViewController与之前新建的控制器类进行关联

三、音乐文件列表控制器中基本界面的搭建

(1)新建一个音乐文件的模型

根据plist文件建立模型:

音乐模型的代码如下:

YYMusicModel.h文件

复制代码
 1 //  2 // YYMusicModel.h
 3 // 20-音频处理(音乐播放器1)
 4 //  5 // Created by apple on 14-8-13.
 6 // Copyright (c) 2014年 yangyong. All rights reserved.
 7 //
 8  9 #import <Foundation/Foundation.h>
10 11 @interface YYMusicModel : NSObject
12 /**
13  * 歌曲名字
14 */ 15 @property (copy, nonatomic) NSString *name;
16 /**
17  * 歌曲大图
18 */ 19 @property (copy, nonatomic) NSString *icon;
20 /**
21  * 歌曲的文件名
22 */ 23 @property (copy, nonatomic) NSString *filename;
24 /**
25  * 歌词的文件名
26 */ 27 @property (copy, nonatomic) NSString *lrcname;
28 /**
29  * 歌手
30 */ 31 @property (copy, nonatomic) NSString *singer;
32 /**
33  * 歌手图标
34 */ 35 @property (copy, nonatomic) NSString *singerIcon;
36 @end
复制代码

(2)使用字典转模型的第三方框架

部分相关代码如下:

此时的界面显示效果为:

(3)添加一个UIimageView的分类,调整歌手的头像(正方形——>圆形)

  分类的实现代码如下:

  UIImage+YY.h文件

1 #import <UIKit/UIKit.h>
2 3 @interface UIImage (YY)
4 + (instancetype)circleImageWithName:(NSString *)name borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)borderColor;
5 @end

  UIImage+YY.m文件

复制代码
 1 #import "UIImage+YY.h"  2 #import <objc/message.h>
 3  4 @implementation UIImage (YY)
 5 + (instancetype)circleImageWithName:(NSString *)name borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)borderColor
 6 {
 7 // 1.加载原图  8 UIImage *oldImage = [UIImage imageNamed:name];
 9 10 // 2.开启上下文 11 CGFloat imageW = oldImage.size.width + 2 * borderWidth;
12 CGFloat imageH = oldImage.size.height + 2 * borderWidth;
13 CGSize imageSize = CGSizeMake(imageW, imageH);
14 UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0.0);
15 16 // 3.取得当前的上下文 17 CGContextRef ctx = UIGraphicsGetCurrentContext();
18 19 // 4.画边框(大圆) 20 [borderColor set];
21 CGFloat bigRadius = imageW * 0.5; // 大圆半径 22 CGFloat centerX = bigRadius; // 圆心 23 CGFloat centerY = bigRadius;
24 CGContextAddArc(ctx, centerX, centerY, bigRadius, 0, M_PI * 2, 0);
25 CGContextFillPath(ctx); // 画圆
26 27 // 5.小圆 28 CGFloat smallRadius = bigRadius - borderWidth;
29 CGContextAddArc(ctx, centerX, centerY, smallRadius, 0, M_PI * 2, 0);
30 // 裁剪(后面画的东西才会受裁剪的影响) 31  CGContextClip(ctx);
32 33 // 6.画图 34  [oldImage drawInRect:CGRectMake(borderWidth, borderWidth, oldImage.size.width, oldImage.size.height)];
35 36 // 7.取图 37 UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
38 39 // 8.结束上下文 40  UIGraphicsEndImageContext();
41 42 return newImage;
43 }
44 @end
复制代码

  分类的使用:

  实现的效果:

(4)推荐使用一个第三方框架,用来处理颜色

  涉及的代码:

四、实现代码

  YYMusicsViewController.m文件

复制代码
 1 //  2 // YYMusicsViewController.m
 3 // 20-音频处理(音乐播放器1)
 4 //  5 // Created by apple on 14-8-13.
 6 // Copyright (c) 2014年 yangyong. All rights reserved.
 7 //
 8  9 #import "YYMusicsViewController.h" 10 #import "YYMusicModel.h" 11 #import "MJExtension.h" 12 #import "UIImage+YY.h" 13 #import "Colours.h" 14 15 @interface YYMusicsViewController ()
16 @property(nonatomic,strong)NSArray *musics;
17 @end 18 19 @implementation YYMusicsViewController
20 #pragma mark-懒加载
21 -(NSArray *)musics
22 {
23 if (_musics==nil) {
24 _musics=[YYMusicModel objectArrayWithFilename:@"Musics.plist"];
25  }
26 return _musics;
27 }
28 29 30 - (void)viewDidLoad
31 {
32  [super viewDidLoad];
33 34 }
35 36 #pragma mark - Table view data source
37 /**
38  *一共多少组
39 */ 40 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
41 {
42 return 1;
43 }
44 /**
45  *每组多少行
46 */ 47 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
48 {
49 return self.musics.count;
50 }
51 /**
52  *每组每行的cell
53 */ 54 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
55 {
56 static NSString *ID=@"ID";
57 UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:ID];
58 if (cell==nil) {
59 cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
60  }
61 //取出数据模型 62 YYMusicModel *model=self.musics[indexPath.row];
63 cell.textLabel.text=model.name;
64 cell.detailTextLabel.text=model.singer;
65 cell.imageView.image=[UIImage circleImageWithName:model.singerIcon borderWidth:1 borderColor:[UIColor skyBlueColor]];
66 return cell;
67 }
68 /**
69  * 设置每个cell的高度
70 */ 71 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
72 {
73 return 70;
74 }
75 76 /**
77  * cell的点击事件
78 */ 79 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
80 {
81 //取消选中被点击的这行 82  [tableView deselectRowAtIndexPath:indexPath animated:YES];
83 84 }
85 @end
复制代码

五、改进

  对tableViewcell的代码进行封装:

实现:新建一个YYmusicCell类,继承自UITableViewCell。

封装代码如下:

YYMusicCell.h文件

复制代码
 1 //  2 // YYMusicCell.h
 3 // 20-音频处理(音乐播放器1)
 4 //  5 // Created by apple on 14-8-13.
 6 // Copyright (c) 2014年 yangyong. All rights reserved.
 7 //
 8  9 #import <UIKit/UIKit.h>
10 @class YYMusicModel;
11 @interface YYMusicCell : UITableViewCell
12 +(instancetype)cellWithTableView:(UITableView *)tableView;
13 @property(nonatomic,strong)YYMusicModel *music;
14 @end
复制代码

YYMusicCell.m文件

复制代码
 1 //  2 // YYMusicCell.m
 3 // 20-音频处理(音乐播放器1)
 4 //  5 // Created by apple on 14-8-13.
 6 // Copyright (c) 2014年 yangyong. All rights reserved.
 7 //
 8  9 #import "YYMusicCell.h" 10 #import "YYMusicModel.h" 11 #import "Colours.h" 12 #import "UIImage+YY.h" 13 14 @implementation YYMusicCell
15 //返回一个cell 16 +(instancetype)cellWithTableView:(UITableView *)tableView
17 {
18 static NSString *ID=@"ID";
19 YYMusicCell *cell=[tableView dequeueReusableCellWithIdentifier:ID];
20 if (cell==nil) {
21 cell=[[YYMusicCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
22  }
23 return cell;
24 }
25 26 -(void)setMusic:(YYMusicModel *)music
27 {
28 _music=music;
29 self.textLabel.text=music.name;
30 self.detailTextLabel.text=music.singer;
31 self.imageView.image=[UIImage circleImageWithName:music.singerIcon borderWidth:1 borderColor:[UIColor skyBlueColor]];
32 }
33 @end
复制代码

YYMusicsViewController.m文件

复制代码
 1 //  2 // YYMusicsViewController.m
 3 // 20-音频处理(音乐播放器1)
 4 //  5 // Created by apple on 14-8-13.
 6 // Copyright (c) 2014年 yangyong. All rights reserved.
 7 //
 8  9 #import "YYMusicsViewController.h" 10 #import "YYMusicModel.h" 11 #import "MJExtension.h" 12 #import "YYMusicCell.h" 13 14 @interface YYMusicsViewController ()
15 @property(nonatomic,strong)NSArray *musics;
16 @end 17 18 @implementation YYMusicsViewController
19 #pragma mark-懒加载
20 -(NSArray *)musics
21 {
22 if (_musics==nil) {
23 _musics=[YYMusicModel objectArrayWithFilename:@"Musics.plist"];
24  }
25 return _musics;
26 }
27 28 - (void)viewDidLoad
29 {
30  [super viewDidLoad];
31 }
32 33 #pragma mark - Table view data source
34 /**
35  *一共多少组
36 */ 37 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
38 {
39 return 1;
40 }
41 /**
42  *每组多少行
43 */ 44 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
45 {
46 return self.musics.count;
47 }
48 /**
49  *每组每行的cell
50 */ 51 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
52 {
53 YYMusicCell *cell=[YYMusicCell cellWithTableView:tableView];
54 cell.music=self.musics[indexPath.row];
55 return cell;
56 }
57 /**
58  * 设置每个cell的高度
59 */ 60 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
61 {
62 return 70;
63 }
64 65 /**
66  * cell的点击事件
67 */ 68 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
69 {
70 //取消选中被点击的这行 71  [tableView deselectRowAtIndexPath:indexPath animated:YES];
72 73 }
74 @end
复制代码

实现效果:

六、补充说明

需要注意的细节处理

(1)UIImageView的分类,方形图片剪为圆形

(2)颜色的处理,文章中推荐的颜色处理框架提供了大量的颜色。

(3)取消选中被点击的这行cell.

   [tableView deselectRowAtIndexPath:indexPath animated:YES];

(4)tableViewCell的封装

目录
相关文章
|
2天前
|
移动开发 开发工具 Android开发
探索安卓与iOS开发的差异:技术选择的影响
【8月更文挑战第17天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各领风骚。本文通过比较这两个平台的编程语言、开发工具及市场策略,揭示了技术选择对开发者和产品成功的重要性。我们将从开发者的视角出发,深入探讨不同平台的技术特性及其对项目实施的具体影响,旨在为即将步入移动开发领域的新手提供一个清晰的指南,同时给予资深开发者新的思考角度。
|
3天前
|
vr&ar Android开发 iOS开发
探索安卓和iOS开发的未来趋势
在移动应用开发的广阔天地里,安卓和iOS两大平台如同双子星座般璀璨夺目。随着技术的不断进步,这两个平台的开发趋势也在悄然发生着变化。本文将带你一探究竟,看看未来安卓和iOS开发将会迎来哪些令人激动的新特性和挑战。让我们一起跟随技术的脚步,开启这场探索之旅吧!
|
4天前
|
移动开发 Java Android开发
安卓与iOS开发:异同探析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文旨在深入探讨这两个平台在开发环境、编程语言、用户界面设计、性能优化及市场分布等方面的异同,为开发者提供实用的比较视角和决策参考。通过对比分析,我们不仅能更清晰地认识到各平台的特性,还能洞察未来移动开发的可能趋势。
|
5天前
|
Java 开发工具 Android开发
探索Android和iOS开发的差异与挑战
在移动应用开发的广阔天地中,Android和iOS两大平台如同两座高峰,各自拥有独特的风景。本文将深入探讨这两个平台的开发差异,包括编程语言、开发工具、用户界面设计等方面,并分析开发者面临的挑战。无论你是初涉移动应用开发的新手,还是已经在这条路上走了很远的老手,这篇文章都将为你提供新的视角和思考。让我们一起走进这个充满创新与挑战的世界,发现那些隐藏在代码背后的秘密。
|
3天前
|
Java Android开发 iOS开发
探索安卓与iOS开发的差异:从新手到专家的旅程
本文将带你走进移动应用开发的两大平台——安卓和iOS,揭示它们之间的主要差异。我们将从新手的视角出发,逐步深入到更复杂的技术层面,帮助你理解这两个平台的开发环境、编程语言和用户界面设计等方面的不同。无论你是刚入门的新手,还是有一定经验的开发者,这篇文章都将为你提供有价值的见解和建议。现在,让我们一起开始这段探索之旅吧!
|
3天前
|
搜索推荐 Android开发 iOS开发
探索安卓与iOS开发的差异之美
在数字时代的浪潮中,移动应用开发如同一场精心编排的交响乐,安卓和iOS这两大平台扮演着不同乐器的角色,各自以独特的方式奏响。本文将带领读者走进这场音乐盛宴,感受两大平台在开发过程中所展现的不同韵律,从设计理念到用户体验,从市场占有率到生态系统,我们将一探究竟,欣赏它们如何在竞争激烈的市场中和谐共存,共同推动技术的进步与创新。
12 0
|
4天前
|
开发工具 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的关键考量
在数字时代,选择正确的开发平台是成功的一半。本文深入探讨了安卓与iOS两大移动操作系统的开发差异,并分析了各自对创新、用户体验和市场需求的响应。通过比较两者的设计哲学、开发工具、市场覆盖和用户参与度,我们揭示了每个平台的独特优势和潜在挑战,旨在为开发者提供决策时的洞见,帮助他们在竞争激烈的应用市场中做出明智的选择。
|
8天前
|
编解码 Android开发 iOS开发
探索安卓与iOS开发的差异:平台选择对项目成功的影响
在移动应用开发的世界中,安卓和iOS是两大主导力量。本文深入探讨了这两个平台在开发过程中的主要差异,并分析了这些差异如何影响项目的成功。通过对比分析,我们旨在为开发者提供决策时的参考,帮助他们根据项目需求和目标用户群体做出最合适的平台选择。
|
5天前
|
Java Android开发 iOS开发
探索安卓与iOS开发的差异:平台选择对项目成功的影响
在移动应用开发的世界中,选择正确的平台是关键。本文通过比较安卓和iOS开发的核心差异,揭示平台选择如何影响应用的性能、用户体验和市场覆盖。我们将深入探讨各自的开发环境、编程语言、用户界面设计原则以及发布流程,以帮助开发者和企业做出明智的决策。
25 9
|
5天前
|
Java 开发工具 Android开发
探索安卓与iOS开发的差异:从新手到专家的旅程
在数字时代的浪潮中,移动应用开发成为了连接世界的桥梁。本文将带你走进安卓与iOS这两大移动操作系统的开发世界,通过比较它们的编程语言、开发工具和环境、用户界面设计以及市场分布等方面,揭示各自的独特之处。无论你是初涉编程的新手,还是寻求进阶的开发者,这篇文章都将为你提供宝贵的洞见,助你在移动应用开发的征途上一帆风顺。
19 5