美文网首页技术第三方库收集集思广益
iOS开发——夜间模式的实现

iOS开发——夜间模式的实现

作者: 无夜之星辰 | 来源:发表于2016-08-06 16:08 被阅读2468次
少女时代 金泰妍 程序员不要只知道看代码,偶尔也要看看风景😊

先来看看效果图

夜间模式小demo

思路

切换夜间/白天模式时,发送通知给所有ViewController,让它们切换到相应的主题。但是,由于未初始化的ViewController无法接收通知,所以,需要将主题模式保存下来(单例或数据持久化),然后在ViewController viewDidLoad时根据保存的主题模式展示相应的主题模式。当然,还需要一个默认主题模式。

开始实现夜间模式

  • 首先建一个管理模式主题的单例管理类:ThemeManagement
    .h文件
#import <Foundation/Foundation.h>

@interface ThemeManagement : NSObject

/** 是否是夜间模式 */
@property (nonatomic,assign) BOOL isDarkTheme;

+ (instancetype)shareManagement;

@end

.m文件

// 单例
static ThemeManagement *themeManagement;

@implementation ThemeManagement

+ (instancetype)shareManagement{
    if (themeManagement == nil) {
        themeManagement = [[ThemeManagement alloc]init];
        
        // 默认不是夜间模式
        themeManagement.isDarkTheme = NO;
    }
    return themeManagement;
}
  • 再创建一个BaseViewControll(其余ViewController继承于它)
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    // 进来的时候根据单例的主题,显示相应的主题
    // 在这里我只是简单的改变了一下背景颜色,实际项目中应准备两套颜色
    if ([ThemeManagement shareManagement].isDarkTheme) {
        self.view.backgroundColor = [UIColor grayColor];
    }else{
        self.view.backgroundColor = [UIColor whiteColor];
    }
    
    // 添加接收改变主题的通知
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(changeTheme) name:@"ChangeTheme" object:nil];
}

// 接收到改变主题的通知后改变主题
- (void)changeTheme{
    if ([ThemeManagement shareManagement].isDarkTheme) {
        self.view.backgroundColor = [UIColor grayColor];
    }else{
        self.view.backgroundColor = [UIColor whiteColor];
    }
}
  • 使用switch来控制白天/夜间模式
// switch的值改变时
- (IBAction)switchValueChanged:(UISwitch *)sender {
    if (sender.on == YES) {
        // 夜间模式开启
        [ThemeManagement shareManagement].isDarkTheme = YES;
    }else{
        // 夜间模式关闭
        [ThemeManagement shareManagement].isDarkTheme = NO;
    }
    // 发送通知 改变主题模式
    [[NSNotificationCenter defaultCenter]postNotificationName:@"ChangeTheme" object:nil];
}

总结

实际项目中使用夜间模式时肯定不是那么简单的,但是思路都是一样的(通知+单例或本地数据持久化),只不过是要准备两套主题颜色。

相关文章

网友评论

  • 阳光下的小泡沫丶:如果想要切换的时候有一个颜色渐变的动画应该怎么办呢,我现在正卡在了这个问题上
    无夜之星辰:@阳光下的小泡沫丶 对于系统的UIView,你可以给UIView写一个category,添加一个渐变动画方法,需要的时候直接调用那个方法。
    对于自定义的view,你可以让它们继承一个baseView,在baseView里接收主题改变的通知,然后改变自身的颜色。
    渐变背景动画可以试试这个:
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationCurve: UIViewAnimationCurveLinear];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:2];
    self.view.backgroundColor = [UIColor purpleColor];
    [UIView commitAnimations];
    }
    阳光下的小泡沫丶:是的,就是从白天状态转化为夜间模式的时候能让view的颜色渐变过渡,屏幕上的控件层次一多,就多不好搞,比如有tabbar和navigationbar的话,动画效果我就不会弄了。
    无夜之星辰:@阳光下的小泡沫丶 是要从一个颜色渐变到另一个颜色吗?
  • 2c94573baccc:其他页面继承首页面,为什么首页面,里面的的东西,所继承的都有,,如何解决,,麻烦楼主,,,
    layneshi:小白问下字体颜色怎么改呢。在父类里面如何
    2c94573baccc:@无夜之星辰 楼主给我发个工程吧,另外视图中创建了表格,盖住了,视图颜色,我不知道怎么弄了,,新手望受教。。。邮箱 865422177@qq.com
    无夜之星辰:@第几季理解 继承会继承父类的所有非私有属性和方法。我建议不是通用的东西不要写在父类里。
  • Brade_Tong:你这个只是改变背景的 那如果是上面盖住了tableview什么的话需要怎么改变呢??
    无夜之星辰:可以建一个UITableView的基类BaseTabeleView,然后写个改变主题的方法。也可以给UITableView添加category。这个需要结合实际情况考虑。网上还有人分享用runtime的,你可以参考下。
  • ttys苹果核:你号楼主,请教一个问题。cell上的背景色如何修改呢
  • 我唔知啊:谢谢分享。
  • Tate_code:小伙子,不错
    无夜之星辰:@Tate_zwt :sunglasses:
  • Charles___::confounded:
    无夜之星辰:@CharlesJF 兄弟有何指教?:anguished:
    Charles___:@无夜之星辰 :pensive:
    无夜之星辰:@CharlesJF :cry:
  • KennyHito:有没有Demo
    KennyHito:@无夜之星辰 ok
    无夜之星辰:@YuHaitao 木有,自己写吧,很简单的
  • 金康帅:思路清晰
    无夜之星辰:@金康帅 :smiley:

本文标题:iOS开发——夜间模式的实现

本文链接:https://www.haomeiwen.com/subject/aikksttx.html