控制系统音量,自己定义MPVolumeView
近期有一个需求,就是控制系统的音量,我们都知道原理在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的更多相关文章
- android控制系统音量
body_sb=(SeekBar)root.findViewById(R.id.body_sb);audioManager=(AudioManager)getActivity().getSystemS ...
- C# 二种方法控制系统音量/麦克风大小
场景:在做播放设备的时候需要控制音量的大小,下面几种方法将满足你的要求 方法一: 改变系统音量设置 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...
- android 滑动滚动条调节音量
利用滚动条滑动控制音量: 定义: private SeekBar mseekBarvolume: 以下实现代码: //调节音量--begin------------------------- //音量 ...
- 在.NET下使用C# 控制Windows系统音量
C#开发Windows应用程序中经常需要去控制系统的音量,分两种方式: 1.使用Win Api控制 2.使用C++ dll控制 Win Api控制: 使用user32.dll和winmm.dll都可以 ...
- 微信iOS收款到账语音提醒开发总结
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/yYCaPMxHGT9LyRyAPewVWQ 作者:l ...
- iOS后台唤醒实战:微信收款到账语音提醒技术总结
1.前言 微信为了解决小商户老板们在频繁交易中不方便核对.确认到账的功能痛点,产品MM提出了新版本需要支持收款到账语音提醒功能.本文借此总结了iOS平台上的APP后台唤醒和语音合成.播放等一系列技术开 ...
- Android开发学习之路-抢红包助手开发全攻略
背景:新年之际,微信微博支付宝红包是到处飞,但是,自己的手速总是比别人慢一点最后导致红包没抢到,红包助手就应运而生. 需求:收到红包的时候进行提醒,然后跳转到红包的界面方便用户 思路:获取“读取通知信 ...
- Android按键事件传递流程(二)
5 应用层如何从Framework层接收按键事件 由3.2和4.5.4节可知,当InputDispatcher通过服务端管道向socket文件描述符发送消息后,epoll机制监听到了I/O事件, ...
- Sprint 冲刺第三阶段第6-10天
这几天一直都在整理我们之前的内容,检查会不会有细节问题.例如界面跳转.颜色等. 因为一直没办法找到guitub存放位置.于是在这里存放一些主代码. MainActivity.java package ...
随机推荐
- C#管理windows服务
.NET Framework中提供了现成的类库可以很方便的实现对windows服务的安装.卸载.启动.停止.获取运行状态等功能.这些类都在System.ServiceProcess命名空间下. 安装w ...
- 维护直线的线段树:Bzoj1568,Bzoj3938(Uoj88)
有这样一类线段树,可以维护一些直线方程并对每个点求出最大值. 首先先看BZOJ1568,输入给你条直线的方程,你需要对于指定的位置求出最大的函数值. 看到数据范围nlog^2n可做,考虑用线段树去维护 ...
- HDU 6194 string string string(后缀自动机)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3238 [题目大意] 给出一个字符串求其出现恰好k次的子串数量 [题解] 对串建立AC自 ...
- python 中__name__ = '__main__' 的作用,到底干嘛的?
python 中__name__ = 'main' 的作用,到底干嘛的? 有句话经典的概括了这段代码的意义: "Make a script both importable and execu ...
- PHP-FPM高负载的解决办法
=================== 优化设置 ========================= When you running a highload website with PHP-FPM ...
- DISQLite3 - A self-contained, embeddable, zero-configuration SQL database engine for Delphi
DISQLite3 implements a self-contained, embeddable, zero-configuration SQL database engine for Delphi ...
- SQLServer2005中的CTE递归查询得到一棵树
最近研究了一下CTE递归查询,感觉这个CTE递归查询蛮好用的,在网上找到了一个比较好的例子,测试例子如下 use City; go create table Tree ( ID ,) primary ...
- .Net高级技术——程序集
程序集(Assembly),可以看做是一堆相关类打一个包,相当于java中的jar包(*).打包的目的:程序中只引用必须的程序集,减小程序的尺寸:一些程序集内部的类不想让其他程序集调用. 我们调用的类 ...
- Redis持久化RDB和AOF优缺点是什么,怎么实现的?我应该用哪一个?
原文http://www.ymq.io/2018/03/24/redis/ Redis是一种高级key-value数据库.数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支 ...
- 算法:堆排序(Heap Sort)
备注 考虑到 Heap 的特性,很容易想到将其用作排序的用处,为了提高效率需要适当的改进一下,如:in place remove 和 in place move down. 代码 using Syst ...