提交
This commit is contained in:
210
TUIKit/TUICore/TUIDarkModel.m
Normal file
210
TUIKit/TUICore/TUIDarkModel.m
Normal file
@@ -0,0 +1,210 @@
|
||||
//
|
||||
// TUIDarkModel.m
|
||||
// TUICore
|
||||
//
|
||||
// Created by xiangzhang on 2021/9/9.
|
||||
// Copyright © 2023 Tencent. All rights reserved.
|
||||
//
|
||||
|
||||
#import "TUIDarkModel.h"
|
||||
#import <objc/message.h>
|
||||
#import "TUIDefine.h"
|
||||
|
||||
@implementation UIColor (TUIDarkModel)
|
||||
|
||||
+ (UIColor *)d_colorWithColorLight:(UIColor *)light dark:(UIColor *)dark {
|
||||
if (@available(iOS 13.0, *)) {
|
||||
return [self colorWithDynamicProvider:^UIColor *_Nonnull(UITraitCollection *_Nonnull traitCollection) {
|
||||
switch (traitCollection.userInterfaceStyle) {
|
||||
case UIUserInterfaceStyleDark:
|
||||
return dark;
|
||||
case UIUserInterfaceStyleLight:
|
||||
case UIUserInterfaceStyleUnspecified:
|
||||
default:
|
||||
return light;
|
||||
}
|
||||
}];
|
||||
} else {
|
||||
return light;
|
||||
}
|
||||
}
|
||||
|
||||
+ (UIColor *)d_systemBlackColor {
|
||||
if (@available(iOS 13.0, *)) {
|
||||
return [self systemBackgroundColor];
|
||||
} else {
|
||||
return [UIColor whiteColor];
|
||||
}
|
||||
}
|
||||
|
||||
+ (UIColor *)d_systemGrayColor {
|
||||
if (@available(iOS 13.0, *)) {
|
||||
return [self systemGrayColor];
|
||||
} else {
|
||||
return [UIColor grayColor];
|
||||
}
|
||||
}
|
||||
|
||||
+ (UIColor *)d_systemRedColor {
|
||||
if (@available(iOS 13.0, *)) {
|
||||
return [self systemRedColor];
|
||||
} else {
|
||||
return [UIColor redColor];
|
||||
}
|
||||
}
|
||||
|
||||
+ (UIColor *)d_systemBlueColor {
|
||||
if (@available(iOS 13.0, *)) {
|
||||
return [self systemBlueColor];
|
||||
} else {
|
||||
return [UIColor blueColor];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIImage (TUIDarkModel)
|
||||
|
||||
+ (UIImage *)d_imagePath:(NSString *)path {
|
||||
UIImage *image = [UIImage d_imageWithImageLight:path dark:[NSString stringWithFormat:@"%@_dark", path]];
|
||||
return image;
|
||||
}
|
||||
|
||||
+ (UIImage *)d_imageNamed:(NSString *)imageName bundle:(NSString *)bundleName;
|
||||
{
|
||||
NSString *path = nil;
|
||||
if ([bundleName isEqualToString:TUIDemoBundle]) {
|
||||
path = TUIDemoImagePath(imageName);
|
||||
} else if ([bundleName isEqualToString:TUICoreBundle]) {
|
||||
path = TUICoreImagePath(imageName);
|
||||
} else if ([bundleName isEqualToString:TUIChatBundle]) {
|
||||
path = TUIChatImagePath(imageName);
|
||||
} else if ([bundleName isEqualToString:TUIChatFaceBundle]) {
|
||||
path = TUIChatFaceImagePath(imageName);
|
||||
} else if ([bundleName isEqualToString:TUIConversationBundle]) {
|
||||
path = TUIConversationImagePath(imageName);
|
||||
} else if ([bundleName isEqualToString:TUIContactBundle]) {
|
||||
path = TUIContactImagePath(imageName);
|
||||
} else if ([bundleName isEqualToString:TUISearchBundle]) {
|
||||
path = TUISearchImagePath(imageName);
|
||||
}
|
||||
if (path) {
|
||||
return [UIImage d_imageWithImageLight:path dark:[NSString stringWithFormat:@"%@_dark", path]];
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
+ (void)d_fixResizableImage {
|
||||
if (@available(iOS 13.0, *)) {
|
||||
Class klass = UIImage.class;
|
||||
SEL selector = @selector(resizableImageWithCapInsets:resizingMode:);
|
||||
Method method = class_getInstanceMethod(klass, selector);
|
||||
if (method == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
IMP originalImp = class_getMethodImplementation(klass, selector);
|
||||
if (!originalImp) {
|
||||
return;
|
||||
}
|
||||
|
||||
IMP dynamicColorCompatibleImp = imp_implementationWithBlock(^UIImage *(UIImage *_self, UIEdgeInsets insets, UIImageResizingMode resizingMode) {
|
||||
UITraitCollection *lightTrait = [self lightTrait];
|
||||
UITraitCollection *darkTrait = [self darkTrait];
|
||||
|
||||
UIImage *resizable = ((UIImage * (*)(UIImage *, SEL, UIEdgeInsets, UIImageResizingMode)) originalImp)(_self, selector, insets, resizingMode);
|
||||
UIImage *resizableInLight = [_self.imageAsset imageWithTraitCollection:lightTrait];
|
||||
UIImage *resizableInDark = [_self.imageAsset imageWithTraitCollection:darkTrait];
|
||||
|
||||
if (resizableInLight) {
|
||||
[resizable.imageAsset registerImage:((UIImage * (*)(UIImage *, SEL, UIEdgeInsets, UIImageResizingMode)) originalImp)(resizableInLight, selector,
|
||||
insets, resizingMode)
|
||||
withTraitCollection:lightTrait];
|
||||
}
|
||||
if (resizableInDark) {
|
||||
[resizable.imageAsset registerImage:((UIImage * (*)(UIImage *, SEL, UIEdgeInsets, UIImageResizingMode)) originalImp)(resizableInDark, selector,
|
||||
insets, resizingMode)
|
||||
withTraitCollection:darkTrait];
|
||||
}
|
||||
return resizable;
|
||||
});
|
||||
|
||||
class_replaceMethod(klass, selector, dynamicColorCompatibleImp, method_getTypeEncoding(method));
|
||||
}
|
||||
}
|
||||
|
||||
+ (UITraitCollection *)lightTrait API_AVAILABLE(ios(13.0)) {
|
||||
static UITraitCollection *trait = nil;
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
trait = [UITraitCollection traitCollectionWithTraitsFromCollections:@[
|
||||
[UITraitCollection traitCollectionWithDisplayScale:UIScreen.mainScreen.scale],
|
||||
[UITraitCollection traitCollectionWithUserInterfaceStyle:UIUserInterfaceStyleLight]
|
||||
]];
|
||||
});
|
||||
|
||||
return trait;
|
||||
}
|
||||
|
||||
+ (UITraitCollection *)darkTrait API_AVAILABLE(ios(13.0)) {
|
||||
static UITraitCollection *trait = nil;
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
trait = [UITraitCollection traitCollectionWithTraitsFromCollections:@[
|
||||
[UITraitCollection traitCollectionWithDisplayScale:UIScreen.mainScreen.scale],
|
||||
[UITraitCollection traitCollectionWithUserInterfaceStyle:UIUserInterfaceStyleDark]
|
||||
]];
|
||||
});
|
||||
|
||||
return trait;
|
||||
}
|
||||
|
||||
+ (UIImage *)d_imageWithImageLight:(NSString *)lightImagePath dark:(NSString *)darkImagePath {
|
||||
UIImage *lightImage = [UIImage imageNamed:lightImagePath];
|
||||
if (!lightImage) {
|
||||
return nil;
|
||||
}
|
||||
if (@available(iOS 13.0, *)) {
|
||||
UIImage *darkImage = [UIImage imageNamed:darkImagePath];
|
||||
UITraitCollection *const scaleTraitCollection = [UITraitCollection currentTraitCollection];
|
||||
UITraitCollection *const darkUnscaledTraitCollection = [UITraitCollection traitCollectionWithUserInterfaceStyle:UIUserInterfaceStyleDark];
|
||||
UITraitCollection *const darkScaledTraitCollection =
|
||||
[UITraitCollection traitCollectionWithTraitsFromCollections:@[ scaleTraitCollection, darkUnscaledTraitCollection ]];
|
||||
UIImage *image = [lightImage
|
||||
imageWithConfiguration:[lightImage.configuration
|
||||
configurationWithTraitCollection:[UITraitCollection traitCollectionWithUserInterfaceStyle:UIUserInterfaceStyleLight]]];
|
||||
darkImage = [darkImage
|
||||
imageWithConfiguration:[darkImage.configuration
|
||||
configurationWithTraitCollection:[UITraitCollection traitCollectionWithUserInterfaceStyle:UIUserInterfaceStyleDark]]];
|
||||
[image.imageAsset registerImage:darkImage withTraitCollection:darkScaledTraitCollection];
|
||||
return image;
|
||||
} else {
|
||||
return lightImage;
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
+ (UIImage *)d_imageWithImageLightImg:(UIImage *)lightImage dark:(UIImage *)darkImage {
|
||||
if (!lightImage) {
|
||||
return nil;
|
||||
}
|
||||
if (@available(iOS 13.0, *)) {
|
||||
UITraitCollection *const scaleTraitCollection = [UITraitCollection currentTraitCollection];
|
||||
UITraitCollection *const darkUnscaledTraitCollection = [UITraitCollection traitCollectionWithUserInterfaceStyle:UIUserInterfaceStyleDark];
|
||||
UITraitCollection *const darkScaledTraitCollection =
|
||||
[UITraitCollection traitCollectionWithTraitsFromCollections:@[ scaleTraitCollection, darkUnscaledTraitCollection ]];
|
||||
UIImage *image = [lightImage
|
||||
imageWithConfiguration:[lightImage.configuration
|
||||
configurationWithTraitCollection:[UITraitCollection traitCollectionWithUserInterfaceStyle:UIUserInterfaceStyleLight]]];
|
||||
darkImage = [darkImage
|
||||
imageWithConfiguration:[darkImage.configuration
|
||||
configurationWithTraitCollection:[UITraitCollection traitCollectionWithUserInterfaceStyle:UIUserInterfaceStyleDark]]];
|
||||
[image.imageAsset registerImage:darkImage withTraitCollection:darkScaledTraitCollection];
|
||||
return image;
|
||||
} else {
|
||||
return lightImage;
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
Reference in New Issue
Block a user