209 lines
8.2 KiB
Objective-C
209 lines
8.2 KiB
Objective-C
//
|
|
// TUIDarkModel.m
|
|
// TUICore
|
|
//
|
|
// Created by xiangzhang on 2021/9/9.
|
|
//
|
|
|
|
#import "TUIDarkModel.h"
|
|
#import "TUIDefine.h"
|
|
#import <objc/message.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);
|
|
} else if ([bundleName isEqualToString:TUIGroupBundle]) {
|
|
path = TUIGroupImagePath(imageName);
|
|
}
|
|
if (path) {
|
|
return [UIImage d_imageWithImageLight:path dark:[NSString stringWithFormat:@"%@_dark",path]];
|
|
}
|
|
return nil;
|
|
}
|
|
|
|
+ (void)d_fixResizableImage{
|
|
[[NSBundle mainBundle] pathForResource:@"" ofType:@"bundle"].length > 0 ;
|
|
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
|