设为首页 加入收藏

TOP

控制系统音量,自定义MPVolumeView(一)
2015-07-24 05:54:35 来源: 作者: 【 】 浏览:10
Tags:控制系统 音量 定义 MPVolumeView

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

// 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];

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

MPVolumeView *volumeView = [[MPVolumeView alloc] init];
    [self.view addSubview:volumeView];
    [volumeView sizeToFit];
    NSLog(@"%@",volumeView.subviews);


打印他的subViews,你会发现

\

有一个叫MPVolumeSlider得类,那么我们只要能控制这个类就行了,可是如果我们强制创建这个类是无法实现的,但是没关系,他的baseClass是UISlider我们可以通过这种方法实现

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];


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



#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(updateva lue:) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:slider1];

}

- (void)updateva lue:(UISlider *)slider{
    self.slider.value = slider.value;
}

- (void)volumeCha
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++命名空间和自定义头文件 下一篇Codeforces 8D Two Friends 三分+..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: