zoukankan      html  css  js  c++  java
  • 控制系统音量,自己定义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

  • 相关阅读:
    IT asset register
    微前端
    强缓存和弱缓存(协商缓存)
    比较运算规则 == 、 ===、Object.is 和 ToPrimitive 方法 [[DefaultValue]] (hint)
    事件冒泡、事件捕获、事件委托
    mysql服务没有响应控制功能
    React 项目中有哪些细节可以优化?实际开发中都做过哪些性能优化
    算法的时间复杂度与空间复杂度
    算法:42.接雨水
    解决每次git pull、git push都需要输入账号和密码的问题
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6719038.html
Copyright © 2011-2022 走看看