近期有一个需求,就是控制系统的音量,我们都知道原理在mediaPlayer.framework框架下,有方法

<span style="font-size:18px;">// The current volume of playing music, in the range of 0.0 to 1.0.
// This property is deprecated -- use MPVolumeView for volume control instead.
@property(nonatomic) float volume NS_DEPRECATED_IOS(3_0, 7_0); [[MPMusicPlayerController applicationMusicPlayer] setVolume:self.volumeSlider.value];</span>

但实际上,在ios7以后,就被弃用了,官方的说法是希望我们用MPVolumeView来取代.那么好,如今有一个问题是,MPVolumeView非常难自己定义,他仅仅能自己定义一些图片,假设我们想通过手势来上下来控制音量大小怎么做呢?

<span style="font-size:18px;">MPVolumeView *volumeView = [[MPVolumeView alloc] init];
[self.view addSubview:volumeView];
[volumeView sizeToFit];
NSLog(@"%@",volumeView.subviews);</span>

打印他的subViews,你会发现

有一个叫MPVolumeSlider得类,那么我们仅仅要能控制这个类即可了,但是假设我们强制创建这个类是无法实现的,但是没关系,他的baseClass是UISlider我们能够通过这样的方法实现

<span style="font-size:18px;">self.slider = [[UISlider alloc]init];
self.slider.backgroundColor = [UIColor blueColor];
for (UIControl *view in volumeView.subviews) {
if ([view.superclass isSubclassOfClass:[UISlider class]]) {
NSLog(@"1");
self.slider = (UISlider *)view;
}
}
self.slider.autoresizesSubviews = NO;
self.slider.autoresizingMask = UIViewAutoresizingNone;
[self.view addSubview:self.slider]; </span>

这个时候还会发现一个问题就是,他的frame是(0,0,35,34),那么你会发现你等于的slider永远都在屏幕的左上角,这个问题我的处理方式是直接hidden = yes,然后又一次在建立一个slider与他的值进行关联,然后重写touch事件,这样就能够直接通过手势来控制了.以下是完整代码

<span style="font-size:18px;">
#import "ViewController.h" @interface ViewController ()
@property (nonatomic,strong)UISlider *volumeSlider;
@property (nonatomic,strong)UISlider *slider;
@property (nonatomic,assign)CGPoint firstPoint;
@property (nonatomic,assign)CGPoint secondPoint;
@end @implementation ViewController - (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib. MPVolumeView *volumeView = [[MPVolumeView alloc] init];
[self.view addSubview:volumeView];
[volumeView sizeToFit];
NSLog(@"%@",volumeView.subviews); self.slider = [[UISlider alloc]init];
self.slider.backgroundColor = [UIColor blueColor];
for (UIControl *view in volumeView.subviews) {
if ([view.superclass isSubclassOfClass:[UISlider class]]) {
NSLog(@"1");
self.slider = (UISlider *)view;
}
}
self.slider.autoresizesSubviews = NO;
self.slider.autoresizingMask = UIViewAutoresizingNone;
[self.view addSubview:self.slider];
self.slider.hidden = YES;
NSLog(@"%f",self.slider.value);
// UISlider *slider = // self.volumeSlider = [[UISlider alloc]initWithFrame:CGRectMake(100, 100, 200, 100)];
// self.volumeSlider.backgroundColor = [UIColor yellowColor];
// self.volumeSlider.minimumValue = 0.0;
// self.volumeSlider.maximumValue = 1.0;
// self.volumeSlider.continuous = YES;
// [self.volumeSlider addTarget:self action:@selector(volumeChange) forControlEvents:UIControlEventValueChanged];
// [self.view addSubview:self.volumeSlider];
UISlider *slider1 = [[UISlider alloc] initWithFrame:CGRectMake(0, 100, 200, 20)];
slider1.tag = 1000;
slider1.minimumValue = self.slider.minimumValue;
slider1.maximumValue = self.slider.maximumValue;
slider1.value = self.slider.value;
[slider1 addTarget:self action:@selector(updateValue:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:slider1]; } - (void)updateValue:(UISlider *)slider{
self.slider.value = slider.value;
} - (void)volumeChange
{
[[MPMusicPlayerController applicationMusicPlayer] setVolume:self.volumeSlider.value]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
for(UITouch *touch in event.allTouches) { self.firstPoint = [touch locationInView:self.view]; } UISlider *slider = (UISlider *)[self.view viewWithTag:1000];
slider.value = self.slider.value;
NSLog(@"touchesBegan");
} - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
for(UITouch *touch in event.allTouches) { self.secondPoint = [touch locationInView:self.view]; }
NSLog(@"firstPoint==%f || secondPoint===%f",self.firstPoint.y,self.secondPoint.y);
NSLog(@"first-second==%f",self.firstPoint.y - self.secondPoint.y); self.slider.value += (self.firstPoint.y - self.secondPoint.y)/500.0; UISlider *slider = (UISlider *)[self.view viewWithTag:1000];
slider.value = self.slider.value;
NSLog(@"value == %f",self.slider.value);
self.firstPoint = self.secondPoint;
} - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"touchesEnded");
self.firstPoint = self.secondPoint = CGPointZero;
} </span>

源代码下载:http://download.csdn.net/detail/woshiwls/7548545

控制系统音量,自己定义MPVolumeView的更多相关文章

  1. android控制系统音量

    body_sb=(SeekBar)root.findViewById(R.id.body_sb);audioManager=(AudioManager)getActivity().getSystemS ...

  2. C# 二种方法控制系统音量/麦克风大小

    场景:在做播放设备的时候需要控制音量的大小,下面几种方法将满足你的要求 方法一: 改变系统音量设置 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...

  3. android 滑动滚动条调节音量

    利用滚动条滑动控制音量: 定义: private SeekBar mseekBarvolume: 以下实现代码: //调节音量--begin------------------------- //音量 ...

  4. 在.NET下使用C# 控制Windows系统音量

    C#开发Windows应用程序中经常需要去控制系统的音量,分两种方式: 1.使用Win Api控制 2.使用C++ dll控制 Win Api控制: 使用user32.dll和winmm.dll都可以 ...

  5. 微信iOS收款到账语音提醒开发总结

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/yYCaPMxHGT9LyRyAPewVWQ 作者:l ...

  6. iOS后台唤醒实战:微信收款到账语音提醒技术总结

    1.前言 微信为了解决小商户老板们在频繁交易中不方便核对.确认到账的功能痛点,产品MM提出了新版本需要支持收款到账语音提醒功能.本文借此总结了iOS平台上的APP后台唤醒和语音合成.播放等一系列技术开 ...

  7. Android开发学习之路-抢红包助手开发全攻略

    背景:新年之际,微信微博支付宝红包是到处飞,但是,自己的手速总是比别人慢一点最后导致红包没抢到,红包助手就应运而生. 需求:收到红包的时候进行提醒,然后跳转到红包的界面方便用户 思路:获取“读取通知信 ...

  8. Android按键事件传递流程(二)

    5    应用层如何从Framework层接收按键事件 由3.2和4.5.4节可知,当InputDispatcher通过服务端管道向socket文件描述符发送消息后,epoll机制监听到了I/O事件, ...

  9. Sprint 冲刺第三阶段第6-10天

    这几天一直都在整理我们之前的内容,检查会不会有细节问题.例如界面跳转.颜色等. 因为一直没办法找到guitub存放位置.于是在这里存放一些主代码. MainActivity.java package ...

随机推荐

  1. gradle/maven/eclipse工程相互转化

    原文:  gradle/maven/eclipse工程相互转化 gradle/maven/eclipse工程相互转化:前提安装好相应的工具和插件.1.Maven->eclipse mvn ecl ...

  2. Xcode 中的IOS工程模板

    1.IOS模板主要分为: Application .Framework.Other application 分为:Master-Detail Application 可以构建树形导航模式引用,生成的代 ...

  3. Yii together

    一对多,多对多的关联时最后的参数 together说明 如果为false,分开查多个语句 如果为true,强制生成一个语句 如果没有设置,分页页生成多个语句,不分页时生成一个语句 多对多时,查询时,中 ...

  4. 【scrapy】使用方法概要(三)(转)

    请初学者作为参考,不建议高手看这个浪费时间] 前两篇大概讲述了scrapy的安装及工作流程.这篇文章主要以一个实例来介绍scrapy的开发流程,本想以教程自带的dirbot作为例子,但感觉大家应该最先 ...

  5. 从零开始搭建linux下laravel 5.5所需环境(一)

    首先你需要有一台linux服务器,或者虚拟机,这里就不赘述了,不会的可以自行百度. 我这里准备的是一台腾讯云服务器,系统为CentOS 7.4 64位. 你可以使用腾讯云的登录按钮登录到服务器,也可以 ...

  6. 用 Apache 发布 ASP.NET 网站

    由于服务器需要发布 JSP .PHP.ASP.NET 几种网站进行测试,Apache 肯定是支持 JSP  和 PHP .鉴于 Apache 的开放精神 ,ASP.Net 应该也是支持的,于是乎 Go ...

  7. xapian的使用

    1.先来看一下Xapian的介绍: Xapian的官方网站是http://www.xapian.org,这是一个非常优秀的开源搜索引擎项目,搜索引擎其实只是一个通俗的说法,正式的说法其实是IR(Inf ...

  8. win7 启动管理器修改默认启动项

    最近给我的超级本做了系统备份,以防万一,但是备份完成后,系统启动的时候总会首先进入Windows启动管理器,且默认启动项是Ghost,还需要选择一下才能进入Win7系统,如何解决这个问题呢? 方案一: ...

  9. Hadoop-2.2.0中文文档——Common-Hadoop HTTP web控制台认证

    简单介绍 此文档描写叙述了怎样配置Hadoop HTTP web控制台,去要求用户认证. 默认地,Hadoop HTTP web控制台(JobTracker, NameNode, TaskTracke ...

  10. [翻译] FMDB

    FMDB https://github.com/ccgus/fmdb This is an Objective-C wrapper around SQLite: http://sqlite.org/ ...