eq调节 ios
2017-07-10 16:38:00 weixin_30474613 阅读数 1

一、简单介绍

  亮度是UIScreen的一个浮点型属性,而UIScreen是一个单例,所以这个亮度是全局的,任何一个地方改动,整个手机的亮度都会改变。这个亮度在iOS5.0后被苹果开放,开发者可以很方便的使用它。在此之前,开发者只能通过自己设置假亮度来达到效果,其实就是覆盖蒙层,修改透明度(自己可以去试试)。

 

二、亮度属性

@property(nonatomic) CGFloat brightness NS_AVAILABLE_IOS(5_0) __TVOS_PROHIBITED;  // 0 .. 1.0, where 1.0 is maximum brightness. Only supported by main screen.
//获取亮度
CGFloat brightess = [[UIScreen mainScreen] brightness];
    
//设置亮度
[[UIScreen mainScreen] setBrightness:0.5];

 

三、使用场景

  电子书中有一个非常重要的功能,就是用户可以随意的改变亮度。有一点需要注意的是,电子书的亮度应该和系统的亮度区别开,电子书模块的亮度不应该影响手机亮度,viewWillAppear和viewWillDisappear在进入前后台时是不会触发的,那么如何处理呢?

  首先:通过一个归档实例属性存储电子书的亮度,这个需要KVO监听,监听用户通过滑动条实时改变电子书亮度并归档。

  其次:在电子式将要显示时通过一个临时的变量记住系统的亮度,同时从解归档取出电子式亮度并设置。

  然后:在电子式将要消失时取出这个临时的系统亮度,并复原手机亮度即可。

  接着:监听是否触发home键挂起程序:applicationWillResignActive,取出这个临时的系统亮度,并复原手机亮度即可。

  最后:监听是否重新进入程序程序:applicationDidBecomeActive,接着采用这个临时的变量记住系统的亮度,同时从解归档取出电子式亮度并设置。

   

四、使用方法

#import <Foundation/Foundation.h>
//此类是一个单例,专门用来存储电子书屏幕亮度
@interface LSYReadConfig : NSObject<NSCoding>
+(instancetype)shareInstance;
@property (nonatomic,assign) CGFloat brightness;
@end


#import "LSYReadConfig.h"

@implementation LSYReadConfig
+(instancetype)shareInstance
{
    static LSYReadConfig *readConfig = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        readConfig = [[self alloc] init];
        
    });
    return readConfig;
}
- (instancetype)init
{
    self = [super init];
    if (self) {
        NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"ReadConfig"];
        if (data) {
            NSKeyedUnarchiver *unarchive = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
            LSYReadConfig *config = [unarchive decodeObjectForKey:@"ReadConfig"];
            [config addObserver:config forKeyPath:@"brightness" options:NSKeyValueObservingOptionNew context:NULL];
            return config;
        }

        _brightness = 0.65f;

options:NSKeyValueObservingOptionNew context:NULL];
        [self addObserver:self forKeyPath:@"brightness" options:NSKeyValueObservingOptionNew context:NULL];
        [LSYReadConfig updateLocalConfig:self];
        
    }
    return self;
}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
    [LSYReadConfig updateLocalConfig:self];
}
+(void)updateLocalConfig:(LSYReadConfig *)config
{
    NSMutableData *data=[[NSMutableData alloc]init];
    NSKeyedArchiver *archiver=[[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
    [archiver encodeObject:config forKey:@"ReadConfig"];
    [archiver finishEncoding];
    [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"ReadConfig"];
}
-(void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeDouble:self.brightness forKey:@"brightness"];
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        self.brightness = [aDecoder decodeDoubleForKey:@"brightness"];
    }
    return self;
}
@end

//用户拖动滑动条改变电子书亮度

-(void)changeScreenHighLight:(UISlider *)sender{

  CGFloat currentLight = (CGFloat)sender.value;
[LSYReadConfig shareInstance].brightness = currentLight;
[[UIScreen mainScreen] setBrightness: currentLight];
}
-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

//记录手机系统亮度并设置电子书亮度 self.systemLight
= [[UIScreen mainScreen] brightness]; [[UIScreen mainScreen] setBrightness:[[LSYReadConfig shareInstance] brightness]]; }
-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    
   //设置手机系统亮度 [[UIScreen mainScreen] setBrightness:self.systemLight]; }
     //监听是否触发home键挂起程序.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil];
    
    //监听是否重新进入程序程序.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];
//从电子书进入后台,复原手机亮度
-(void)applicationWillResignActive:(UIApplication *)application {
    [[UIScreen mainScreen] setBrightness:self.systemLight];
}

//进入电子书前台,设置电子书亮度
-(void)applicationDidBecomeActive:(UIApplication *)application {
    
    self.systemLight = [[UIScreen mainScreen] brightness];
    [[UIScreen mainScreen] setBrightness:[[LSYReadConfig shareInstance] brightness]];
}

 

转载于:https://www.cnblogs.com/XYQ-208910/p/7146534.html

2017-10-19 11:03:00 weixin_34153893 阅读数 15

一、简单介绍

  亮度是UIScreen的一个浮点型属性,而UIScreen是一个单例,所以这个亮度是全局的,任何一个地方改动,整个手机的亮度都会改变。这个亮度在iOS5.0后被苹果开放,开发者可以很方便的使用它。在此之前,开发者只能通过自己设置假亮度来达到效果,其实就是覆盖蒙层,修改透明度(自己可以去试试)。

 

二、亮度属性

@property(nonatomic) CGFloat brightness NS_AVAILABLE_IOS(5_0) __TVOS_PROHIBITED;  // 0 .. 1.0, where 1.0 is maximum brightness. Only supported by main screen.
//获取亮度
CGFloat brightess = [[UIScreen mainScreen] brightness];
    
//设置亮度
[[UIScreen mainScreen] setBrightness:0.5];

 

三、使用场景

  电子书中有一个非常重要的功能,就是用户可以随意的改变亮度。有一点需要注意的是,电子书的亮度应该和系统的亮度区别开,电子书模块的亮度不应该影响手机亮度,viewWillAppear和viewWillDisappear在进入前后台时是不会触发的,那么如何处理呢?

  首先:通过一个归档实例属性存储电子书的亮度,这个需要KVO监听,监听用户通过滑动条实时改变电子书亮度并归档。

  其次:在电子式将要显示时通过一个临时的变量记住系统的亮度,同时从解归档取出电子式亮度并设置。

  然后:在电子式将要消失时取出这个临时的系统亮度,并复原手机亮度即可。

  接着:监听是否触发home键挂起程序:applicationWillResignActive,取出这个临时的系统亮度,并复原手机亮度即可。

  最后:监听是否重新进入程序程序:applicationDidBecomeActive,接着采用这个临时的变量记住系统的亮度,同时从解归档取出电子式亮度并设置。

   

四、使用方法

复制代码
#import <Foundation/Foundation.h>
//此类是一个单例,专门用来存储电子书屏幕亮度
@interface LSYReadConfig : NSObject<NSCoding>
+(instancetype)shareInstance;
@property (nonatomic,assign) CGFloat brightness;
@end


#import "LSYReadConfig.h"

@implementation LSYReadConfig
+(instancetype)shareInstance
{
    static LSYReadConfig *readConfig = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        readConfig = [[self alloc] init];
        
    });
    return readConfig;
}
- (instancetype)init
{
    self = [super init];
    if (self) {
        NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"ReadConfig"];
        if (data) {
            NSKeyedUnarchiver *unarchive = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
            LSYReadConfig *config = [unarchive decodeObjectForKey:@"ReadConfig"];
            [config addObserver:config forKeyPath:@"brightness" options:NSKeyValueObservingOptionNew context:NULL];
            return config;
        }

        _brightness = 0.65f;

options:NSKeyValueObservingOptionNew context:NULL];
        [self addObserver:self forKeyPath:@"brightness" options:NSKeyValueObservingOptionNew context:NULL];
        [LSYReadConfig updateLocalConfig:self];
        
    }
    return self;
}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
    [LSYReadConfig updateLocalConfig:self];
}
+(void)updateLocalConfig:(LSYReadConfig *)config
{
    NSMutableData *data=[[NSMutableData alloc]init];
    NSKeyedArchiver *archiver=[[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
    [archiver encodeObject:config forKey:@"ReadConfig"];
    [archiver finishEncoding];
    [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"ReadConfig"];
}
-(void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeDouble:self.brightness forKey:@"brightness"];
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        self.brightness = [aDecoder decodeDoubleForKey:@"brightness"];
    }
    return self;
}
@end

//用户拖动滑动条改变电子书亮度

-(void)changeScreenHighLight:(UISlider *)sender{

  CGFloat currentLight = (CGFloat)sender.value;
[LSYReadConfig shareInstance].brightness = currentLight;
[[UIScreen mainScreen] setBrightness: currentLight];
}
复制代码
复制代码
-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

//记录手机系统亮度并设置电子书亮度 self.systemLight
= [[UIScreen mainScreen] brightness]; [[UIScreen mainScreen] setBrightness:[[LSYReadConfig shareInstance] brightness]]; }
复制代码
复制代码
-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    
//设置手机系统亮度 [[UIScreen mainScreen] setBrightness:self.systemLight]; }
复制代码
复制代码
     //监听是否触发home键挂起程序.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil];
    
    //监听是否重新进入程序程序.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];
复制代码
复制代码
//从电子书进入后台,复原手机亮度
-(void)applicationWillResignActive:(UIApplication *)application {
    [[UIScreen mainScreen] setBrightness:self.systemLight];
}

//进入电子书前台,设置电子书亮度
-(void)applicationDidBecomeActive:(UIApplication *)application {
    
    self.systemLight = [[UIScreen mainScreen] brightness];
    [[UIScreen mainScreen] setBrightness:[[LSYReadConfig shareInstance] brightness]];
}
复制代码

 

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!
分类: iOS高级

本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/7146534.html,如需转载请自行联系原作者
2016-06-24 16:42:00 weixin_34138377 阅读数 17

控制系统音量总得来说有如下两种方法

  • 第一种方法是苹果在7.0以后建议用的,不过通过第一种方法,调节系统音量会弹出系统音量提示框和系统音量滑动条,但是有些需求是不需要显示这些的,我们可以通过如下方法,设置frame和showsRouteButton属性,两者缺一不可。
  • 如果想单纯的控制音量,则不推荐使用第二种方法。
//这个默认值是YES,为了突出我又刻意设置了一遍,设为NO之后,系统音量条是隐藏了,可是会弹出音量提示框
 _volumeView.showsVolumeSlider = YES;
//通过设置frame来达到隐藏音量滑动条
[_volumeView setFrame:CGRectMake(-1000, -1000, 10, 10)];
//去掉提示框
_volumeView.showsRouteButton = NO;
  1. 通过MPVolumeView来控制系统音量的方法
-(void)controlVolume{

    _volumeView = [[MPVolumeView alloc]init];

    _volumeView.showsRouteButton = NO;
    //默认YES,这里为了突出,故意设置一遍
    _volumeView.showsVolumeSlider = YES;

    [_volumeView sizeToFit];
    [_volumeView setFrame:CGRectMake(-1000, -1000, 10, 10)];

    [self addSubview:_volumeView];
    [_volumeView userActivity];

    for (UIView *view in [_volumeView subviews]){
        if ([[view.class description] isEqualToString:@"MPVolumeSlider"]){
            _volumeSlider = (UISlider*)view;
            break;
        }
    }
    //设置默认打开视频时声音为0.3,如果不设置的话,获取的当前声音始终是0
    [_volumeSlider setValue:0.2];
    
    //获取最是刚打开时的音量值
    _volumeValue = _volumeSlider.value;
    
    //设置展示音量条的值
    _showVolueSlider.value = _volumeValue;
}
  1. 下面这种方法大家就不要试了,在7.0以后苹果反对使用此方法,建议用MPVolumeView类。
MPMusicPlayerController *mpc = [MPMusicPlayerController applicationMusicPlayer];
//This property is deprecated -- use MPVolumeView for volume control instead.
//在7.0以后苹果反对使用此方法,建议用MPVolumeView
mpc.volume = 0;  //0.0~1.0
2017-02-22 15:35:00 weixin_34049948 阅读数 23

 获取系统屏幕当前的亮度值

float value = [UIScreen mainScreen].brightness;

设置系统屏幕的亮度值

[[UIScreen mainScreen] setBrightness:value];

2015-06-13 20:10:00 weixin_34087503 阅读数 2

iOS的AVFoundation框架提供了基本的音视频播放工具,我们基本上可以靠其中提供的类完成绝大部分的音视频播放任务。但是在音频播放的输出音量的处理上,苹果的策略比较保守。尽管AVPlayerAVPAudiolayerzhe这些类提供了音量调节功能,但这些音量控制属于App级别的控制。好处就是音量调节独立于系统音量,调节大小时不会影响系统音量。但有时候我们可能希望修改系统音量,以免在调节声音的时候,如果系统音量过小,App调节音量效果不明显。一般来说要调节系统音量会有以下方法:

请注意:修改系统音量无法在模拟器上看到效果,必须使用真机调试才能看到效果!

使用MPVolumeView

这个方法是苹果官方推荐的方法。MPVolumeView是Media Player Framework中的一个UI组件,直接包含了对系统音量和Airplay设备的音频镜像路由的控制功能。其中包含一个MPVolumeSlider的subview用来控制音量。这个MPVolumeSlider是一个私有类,我们无法手动创建此类,但这个类是UISlider的子类。MPVolumeView的使用很简单,只需要将其加入到一个父视图中,给予父视图合适的大小,再创建MPVolumeView示例,将其加入到父视图中即可,苹果官方的文档1中有示例代码可以参考。

这个方法的缺点如下:

  • UI可定制的的程度低。  MPVolumeView只提供了有限的几个方法来定制其中的Slider和Route Button的样式,而且基本上只能靠换图片解决。如果你想把Slider操作换成Button或者其他的UI组件,那是不可能的。

  • 没有额外的音量控制API。 目前为止没有发现iOS的公开API中有可以直接操作系统音量的,所以修改系统音量只能使用这个UI组件。

如果还想给UI加入手势操作来控制音量,这种直接使用MPVolumeView是做不到的,那么有没有什么方法可以绕过这限制呢?办法还是有的。

编程实现系统音量调节2

上一小节我们提到了MPVolumeView这个组件中,有一个subview来控制音量,即MPVolumeSlider。其实我们可以通过遍历MPVolumeView实例的subviews来得到MPVolumeSlider的实例,从而通过这个UI组件来操作系统音量。

通过MPVolumeSlider的实例来操作系统音量

我们首先通过创建一个MPVolumeView,然后遍历找出MPVolumeSlider的实例。这个实例提供setValue:animated:方法来设置系统音量。我们也可以通过volumeSlider.value这个属性来获取当前的系统音量。具体的代码如下:

MPVolumeView *volumeView = [[MPVolumeView alloc] init];
UISlider* volumeViewSlider = nil;
for (UIView *view in [_instance.volumeView subviews]){    
    if ([view.class.description isEqualToString:@"MPVolumeSlider"]){
        volumeViewSlider = (UISlider*)view;        
        break;
    }
}
// retrieve system volumefloat systemVolume = volumeViewSlider.value;
// change system volume, the value is between 0.0f and 1.0f
[volumeViewSlider setValue:1.0f animated:NO];
// send UI control event to make the change effect right now.
[volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside];

上面的代码演示如何获取和修改系统音量,注意音量取值为0到1之间的浮点数。

有问题!我不喜欢系统弹出音量提示

上面通过编程的方法可以很完美的调节系统音量,但是每次修改都会弹出系统提示框告知:
iOS音量提示
有时候这种提示我们未必会需要,那么怎么取消掉这个提示呢?实际上MPVolumeView没有提供任何接口来调节是否需要显示系统音量提示。但是我们发现一点:MPVolumeView处在当前视图的层级之中时,系统就不会显示音量提示。那么事情好办了,我们只要确保两点:

  • MPVolumeView视图处在屏幕上看不见的地方,比如某个不透明视图的下方,或者本视图的非可见区域,一个常见的做法就是把该视图的frame设置为区域以外的地方,比如volumeView.frame = CGRectMake(-1000, -100, 100, 100);

  • 确保MPVolumeView视图的hidden属性值为NO。因为当hidden为YES时,同样会弹出提示。

还有问题,我修改了系统音量但是不是通过我的UI

另一个可能的情况就是用户自己通过硬件的音量调节按钮(位于设备侧边)来调节音量,这种情况会使得你的业务逻辑出现问题,因为你只为自己的App UI写了回调,那么怎么为硬件按钮的事件添加回调呢?我们可以使用Notification Center来完成。
这里只需要监听AVSystemController_SystemVolumeDidChangeNotification事件即可。具体代码如下:

  • 首先在资源载入阶段加入监听事件的代码

NSError *error;
// Active audio session before you listen to the volume change event.
// It must be called first.
// The old style code equivalent to the line below is:
//// AudioSessionInitialize(NULL, NULL, NULL, NULL);
// AudioSessionSetActive(YES);
//// Now the code above is deprecated in iOS 7.0, you should use the new
// code here.
[[AVAudioSession sharedInstance] setActive:YES error:&error];
// add event handler, for this example, it is `volumeChange:` method
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(volumeChanged:) name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];

  • 然后实现事件回调方法

- (void)volumeChanged:(NSNotification *)notification
{   
     // service logic here.
}

  • 最后记得在资源回收时取消掉事件监听

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];
}

这样,每次用户使用硬件按钮调节音量的时候也会执行你写好的逻辑。

以上除了第一个方案以外,所有的解决方案都属于非官方的hack性质的方法,但是都没有调用私有API,所以没有被Apple审核拒掉的风险。


转载于:https://my.oschina.net/sayonala/blog/466414

ios 调节系统音量

阅读数 542

IOS拍照调节亮度

阅读数 58

没有更多推荐了,返回首页