近期有一个需求,就是控制系统的音量,我们都知道原理在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. 【DFS好题】BZOJ1999- [Noip2007]Core树网的核(数据加强版)

    NOIP的数据好水,一开始有好几个错结果NOIP数据就水过了?? [题目大意] 求无根树的直径上一段不超过S长的链,使得偏心距最小.具体概念见原题. [思路] 首先明确几个性质: (1)对于树中的任意 ...

  2. NOIP2018 RP++

    飞吧,不用看向地面. NOIP,RP++.

  3. Codeforces Round #280 (Div. 2) E. Vanya and Field 思维题

    E. Vanya and Field time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  4. Codeforces Round #279 (Div. 2) A. Team Olympiad 水题

    #include<stdio.h> #include<iostream> #include<memory.h> #include<math.h> usi ...

  5. (转,学习记录)MD5加密算法中的加盐值(SALT)

    我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码. 加Salt可以一定程度上解决这一问题.所谓加Salt方法,就 ...

  6. OC学习那些事:第一个OC类

    一.创建一个新的OC类: 1.点击File->New File,打开Choose a template for your new file窗口,选择Objective-C class,点击Nex ...

  7. mysql-debug

    http://www1.huachu.com.cn/read/readbookinfo.asp?sectionid=1000002778 http://hedengcheng.com/?p=238 h ...

  8. AWR--service statistics

    近期发现一个奇怪的现象,数据库报告上看负载非常高.可是cpu和等待事件都非常低,不知道消耗的资源跑到哪里去了? Snap Id Snap Time Sessions Cursors/Session B ...

  9. iframe动态改变内嵌页面高度

    test.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://w ...

  10. asp.net MVC 3/4 equivalent to a response.filter

    am in a need to intercept all of the html that will be sent to the browser and replace some tags tha ...