2019-10-21 09:59:22 +08:00
|
|
|
/*
|
|
|
|
* Copyright [2019] [Doric.Pub]
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
2019-07-30 15:20:11 +08:00
|
|
|
//
|
|
|
|
// DoricUtil.m
|
|
|
|
// Doric
|
|
|
|
//
|
|
|
|
// Created by pengfei.zhou on 2019/7/26.
|
|
|
|
//
|
|
|
|
|
|
|
|
#import "DoricUtil.h"
|
2019-08-14 14:13:08 +08:00
|
|
|
#import "DoricContext.h"
|
2019-11-20 17:24:50 +08:00
|
|
|
#import "UIView+Doric.h"
|
2023-03-01 15:05:01 +08:00
|
|
|
#import <sys/utsname.h>
|
2019-07-30 15:20:11 +08:00
|
|
|
|
2019-10-12 14:48:19 +08:00
|
|
|
void DoricLog(NSString *_Nonnull format, ...) {
|
2019-07-30 15:20:11 +08:00
|
|
|
va_list args;
|
|
|
|
va_start(args, format);
|
2019-10-12 14:48:19 +08:00
|
|
|
NSLogv([NSString stringWithFormat:@"Doric:%@", format], args);
|
2019-07-30 15:20:11 +08:00
|
|
|
va_end(args);
|
|
|
|
}
|
|
|
|
|
2023-02-09 14:06:47 +08:00
|
|
|
void DoricSafeLog(NSString *_Nonnull message) {
|
|
|
|
NSLog(@"%@", message);
|
|
|
|
}
|
|
|
|
|
2019-07-30 15:20:11 +08:00
|
|
|
UIColor *DoricColor(NSNumber *number) {
|
|
|
|
CGFloat r, g, b, a;
|
|
|
|
long colorValue = [number longValue];
|
2019-10-12 14:48:19 +08:00
|
|
|
a = ((colorValue >> 24) & 0xff) / 255.0f;
|
|
|
|
r = ((colorValue >> 16) & 0xff) / 255.0f;
|
|
|
|
g = ((colorValue >> 8) & 0xff) / 255.0f;
|
|
|
|
b = ((colorValue >> 0) & 0xff) / 255.0f;
|
2019-07-30 15:20:11 +08:00
|
|
|
return [UIColor colorWithRed:r green:g blue:b alpha:a];
|
|
|
|
}
|
2019-08-14 14:13:08 +08:00
|
|
|
|
2020-03-11 11:30:49 +08:00
|
|
|
NSNumber *DoricColorToNumber(UIColor *color) {
|
|
|
|
CGFloat r, g, b, a;
|
|
|
|
[color getRed:&r green:&g blue:&b alpha:&a];
|
|
|
|
return @((((long) (a * 225) & 0xff) << 24)
|
|
|
|
| (((long) (r * 225) & 0xff) << 16)
|
|
|
|
| (((long) (g * 225) & 0xff) << 8)
|
|
|
|
| (((long) (b * 225) & 0xff) << 0));
|
|
|
|
}
|
|
|
|
|
2019-08-14 14:13:08 +08:00
|
|
|
NSBundle *DoricBundle() {
|
|
|
|
NSBundle *bundle = [NSBundle bundleForClass:[DoricContext class]];
|
|
|
|
NSURL *url = [bundle URLForResource:@"Doric" withExtension:@"bundle"];
|
|
|
|
return [NSBundle bundleWithURL:url];
|
|
|
|
}
|
2019-11-20 17:24:50 +08:00
|
|
|
|
|
|
|
|
2019-11-25 15:16:06 +08:00
|
|
|
void ShowToast(NSString *text, DoricGravity gravity) {
|
2019-11-20 18:15:04 +08:00
|
|
|
UIView *superView = [UIApplication sharedApplication].windows.lastObject;
|
2019-11-20 17:24:50 +08:00
|
|
|
UILabel *label = [[UILabel alloc] init];
|
|
|
|
label.font = [UIFont systemFontOfSize:20.f];
|
|
|
|
label.text = text;
|
|
|
|
label.textAlignment = NSTextAlignmentCenter;
|
|
|
|
label.layer.masksToBounds = YES;
|
|
|
|
label.backgroundColor = [UIColor grayColor];
|
|
|
|
label.textColor = [UIColor whiteColor];
|
|
|
|
[label sizeToFit];
|
|
|
|
label.width += 30;
|
|
|
|
label.height += 10;
|
|
|
|
label.layer.cornerRadius = label.height / 2;
|
|
|
|
label.centerX = superView.width / 2;
|
2020-04-03 10:19:13 +08:00
|
|
|
if ((gravity & DoricGravityBottom) == DoricGravityBottom) {
|
2019-11-20 18:15:04 +08:00
|
|
|
label.bottom = superView.height - 20;
|
2020-04-26 11:21:19 +08:00
|
|
|
} else if ((gravity & DoricGravityTop) == DoricGravityTop) {
|
|
|
|
label.top = 108;
|
|
|
|
} else {
|
|
|
|
label.centerY = (superView.height - 88) / 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
[superView addSubview:label];
|
|
|
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t) (2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
|
|
|
[label removeFromSuperview];
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
void ShowToastInVC(UIViewController *_Nonnull vc, NSString *_Nonnull text, DoricGravity gravity) {
|
|
|
|
UIView *superView = vc.view;
|
|
|
|
UILabel *label = [[UILabel alloc] init];
|
|
|
|
label.font = [UIFont systemFontOfSize:20.f];
|
|
|
|
label.text = text;
|
|
|
|
label.textAlignment = NSTextAlignmentCenter;
|
|
|
|
label.layer.masksToBounds = YES;
|
|
|
|
label.backgroundColor = [UIColor grayColor];
|
|
|
|
label.textColor = [UIColor whiteColor];
|
|
|
|
[label sizeToFit];
|
|
|
|
label.width += 30;
|
|
|
|
label.height += 10;
|
|
|
|
label.layer.cornerRadius = label.height / 2;
|
|
|
|
label.centerX = superView.width / 2;
|
|
|
|
if ((gravity & DoricGravityBottom) == DoricGravityBottom) {
|
|
|
|
label.bottom = superView.height - 20;
|
2020-04-03 16:36:43 +08:00
|
|
|
} else if ((gravity & DoricGravityTop) == DoricGravityTop) {
|
2020-09-05 11:13:28 +08:00
|
|
|
label.top = 20;
|
2019-11-20 18:15:04 +08:00
|
|
|
} else {
|
|
|
|
label.centerY = (superView.height - 88) / 2;
|
|
|
|
}
|
|
|
|
|
2019-11-20 17:24:50 +08:00
|
|
|
[superView addSubview:label];
|
|
|
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t) (2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
|
|
|
[label removeFromSuperview];
|
|
|
|
});
|
2019-11-25 15:16:06 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
UIImage *UIImageWithColor(UIColor *color) {
|
|
|
|
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
|
|
|
|
UIGraphicsBeginImageContext(rect.size);
|
|
|
|
CGContextRef context = UIGraphicsGetCurrentContext();
|
|
|
|
CGContextSetFillColorWithColor(context, [color CGColor]);
|
|
|
|
CGContextFillRect(context, rect);
|
|
|
|
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
|
|
|
|
UIGraphicsEndImageContext();
|
|
|
|
return image;
|
|
|
|
}
|
2020-03-19 11:52:02 +08:00
|
|
|
|
|
|
|
BOOL hasNotch() {
|
|
|
|
if (@available(iOS 11.0, *)) {
|
2022-07-13 17:13:09 +08:00
|
|
|
CGFloat height;
|
|
|
|
if ([[UIApplication sharedApplication] delegate].window) {
|
|
|
|
height = [[UIApplication sharedApplication] delegate].window.safeAreaInsets.bottom;
|
|
|
|
} else {
|
|
|
|
height = [UIApplication sharedApplication].keyWindow.safeAreaInsets.bottom;
|
|
|
|
}
|
2020-03-19 11:52:02 +08:00
|
|
|
return (height > 0);
|
|
|
|
} else {
|
|
|
|
return NO;
|
|
|
|
}
|
|
|
|
}
|
2023-03-01 15:05:01 +08:00
|
|
|
|
|
|
|
CGFloat systemStatusBarHeight() {
|
|
|
|
CGFloat statusBarHeight = 0;
|
|
|
|
if (@available(iOS 13.0, *)) {
|
|
|
|
UIStatusBarManager *statusBarManager = [UIApplication sharedApplication].windows.firstObject.windowScene.statusBarManager;
|
|
|
|
statusBarHeight = statusBarManager.statusBarFrame.size.height;
|
|
|
|
} else {
|
|
|
|
statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;
|
|
|
|
}
|
|
|
|
statusBarHeight = statusBarHeight > 0 ? statusBarHeight : statusBarHeightFixed();
|
|
|
|
return statusBarHeight;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
CGFloat statusBarHeightFixed() {
|
|
|
|
if (isDynamicIslandDevice()) {
|
|
|
|
return 54.0f;
|
|
|
|
}
|
|
|
|
return isX() ? 44.0f : 20.0f;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL isDynamicIslandDevice() {
|
|
|
|
struct utsname systemInfo;
|
|
|
|
uname(&systemInfo);
|
|
|
|
NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSASCIIStringEncoding];
|
|
|
|
if (TARGET_OS_SIMULATOR == 1) {
|
|
|
|
platform = [NSProcessInfo new].environment[@"SIMULATOR_MODEL_IDENTIFIER"];
|
|
|
|
}
|
|
|
|
|
|
|
|
if ([platform isEqualToString:@"iPhone15,2"] || [platform isEqualToString:@"iPhone15,3"]) {
|
|
|
|
return YES;
|
|
|
|
} else {
|
|
|
|
return NO;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL isX() {
|
|
|
|
BOOL iPhoneXSeries = NO;
|
|
|
|
if (UIDevice.currentDevice.userInterfaceIdiom != UIUserInterfaceIdiomPhone) {
|
|
|
|
return iPhoneXSeries;
|
|
|
|
}
|
|
|
|
if (@available(iOS 11.0, *)) {
|
|
|
|
UIWindow *mainWindow = [UIApplication sharedApplication].windows.firstObject;
|
|
|
|
if (mainWindow.safeAreaInsets.bottom > 0) {
|
|
|
|
iPhoneXSeries = YES;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return iPhoneXSeries;
|
|
|
|
}
|