美文网首页
整个app切换主题颜色--用于特殊节日纪念

整个app切换主题颜色--用于特殊节日纪念

作者: 不言弃zxf | 来源:发表于2022-11-29 18:27 被阅读0次

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface IMYAppGrayStyle : NSObject

/// 开启全局变灰

+ (void)open;

/// 关闭全局变灰

+ (void)close;

/// 添加灰色模式

+ (void)addToView:(UIView *)view;

/// 移除灰色模式

+ (void)removeFromView:(UIView *)view;

@end

NS_ASSUME_NONNULL_END

#import "IMYAppGrayStyle.h"

@interface IMYAppGrayStyleCoverView : UIView

@end

@implementation IMYAppGrayStyleCoverView

+ (NSHashTable *)allCoverViews {

    static NSHashTable *array;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        array = [NSHashTable weakObjectsHashTable];

    });

    return array;

}

+ (void)showInMaskerView:(UIView *)maskerView {

    if (!@available(iOS 13, *)) {

        // iOS13 之前系统不支持

        return;

    }

    // 遍历是否已添加 gray cover view

    for (UIView *subview in maskerView.subviews) {

        if ([subview isKindOfClass:IMYAppGrayStyleCoverView.class]) {

            return;

        }

    }

    IMYAppGrayStyleCoverView *coverView = [[self alloc] initWithFrame:maskerView.bounds];

    coverView.userInteractionEnabled = NO;

    coverView.backgroundColor = [UIColor lightGrayColor];

    coverView.layer.compositingFilter = @"saturationBlendMode";

    coverView.layer.zPosition = FLT_MAX;

    [maskerView addSubview:coverView];

    [self.allCoverViews addObject:coverView];

}

@end

@implementation IMYAppGrayStyle

+ (void)open {

    NSAssert(NSThread.isMainThread, @"必须在主线程调用!");

    NSMutableSet *windows = [NSMutableSet set];

    [windows addObjectsFromArray:UIApplication.sharedApplication.windows];

    if (@available(iOS 13, *)) {

        for (UIWindowScene *scene in UIApplication.sharedApplication.connectedScenes) {

            if (![scene isKindOfClass:UIWindowScene.class]) {

                continue;

            }

            [windows addObjectsFromArray:scene.windows];

        }

    }

    // 遍历所有window,给它们加上蒙版

    for (UIWindow *window in windows) {

        NSString *className = NSStringFromClass(window.class);

        if (![className containsString:@"UIText"]) {

            [IMYAppGrayStyleCoverView showInMaskerView:window];

        }

    }

}

+ (void)close {

    NSAssert(NSThread.isMainThread, @"必须在主线程调用!");

    for (UIView *coverView in IMYAppGrayStyleCoverView.allCoverViews) {

        [coverView removeFromSuperview];

    }

}

+ (void)addToView:(UIView *)view {

    [IMYAppGrayStyleCoverView showInMaskerView:view];

}

+ (void)removeFromView:(UIView *)view {

    for (UIView *subview in view.subviews) {

        if ([subview isKindOfClass:IMYAppGrayStyleCoverView.class]) {

            [subview removeFromSuperview];

        }

    }

}

@end

相关文章

  • Android进阶之SmartColorView

    2017年开始啦,就用这个自定义颜色选择控件来纪念下吧~~ 相信做过安卓应用的主题切换、富文本编辑器文字颜色切换、...

  • iOS 如何动态切换 APP 的主题

    主题的切换就是可以增强用户体验、结合运营活动的一个点:譬如 QQ 的夜间模式,节日里电商 APP 的皮肤切换...

  • iOS控件---UI适配器切换主题

    Demo 一、需求: 1、一键切换APP的主题 二、思路: 主题所包含的内容有:字体、字体大小、颜色、图片,所以需...

  • Android App灰色模式

    很多App在特殊节日将为了缅怀、纪念,会将App调成灰色调展示,比如淘宝,微博,今日头条等。之前我们app也支持了...

  • iOS主题颜色切换

    效果 demo在这里:https://github.com/fengfengaima/ColorChangesFo...

  • Flutter 学习 之 主题设置 ThemeData

    基于ThemeData 实现主题切换 1. 实现可以亮暗主题切换2. 实现可以颜色主题的切换3.当主题为白色的时候...

  • iOS开发之App主题切换完整解决方案(Swift版)

    iOS开发之App主题切换完整解决方案(Swift版) iOS开发之App主题切换完整解决方案(Swift版)

  • iOS全局设置xib主题颜色

    之前多次看到有人问怎么实现xib中的颜色管理,就是app切换主题色的时候,xib中的颜色也会跟着变化。其实自己一开...

  • Android 深入(二)- 利用ToolBar实现动态主题

    利用ToolBar实现主题切换原理:切换主题时,将颜色值存储到Preference中,同时更新主题样式。再次打开A...

  • 14、自定义皮肤

    创建需要引用皮肤色的主文件, 定义相应的函数 创建主题文件 定义自己的颜色类型如 主颜色,渐变色等 切换主题 切换...

网友评论

      本文标题:整个app切换主题颜色--用于特殊节日纪念

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