Skip to content

Commit 919fee5

Browse files
author
molicechen
committed
4.4.3
1 parent 137e54f commit 919fee5

File tree

11 files changed

+135
-49
lines changed

11 files changed

+135
-49
lines changed

QMUIKit.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = "QMUIKit"
3-
s.version = "4.4.2"
3+
s.version = "4.4.3"
44
s.summary = "致力于提高项目 UI 开发效率的解决方案"
55
s.description = <<-DESC
66
QMUI iOS 是一个致力于提高项目 UI 开发效率的解决方案,其设计目的是用于辅助快速搭建一个具备基本设计还原效果的 iOS 项目,同时利用自身提供的丰富控件及兼容处理, 让开发者能专注于业务需求而无需耗费精力在基础代码的设计上。不管是新项目的创建,或是已有项目的维护,均可使开发效率和项目质量得到大幅度提升。

QMUIKit/QMUIComponents/QMUITheme/UIImage+QMUITheme.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ NS_ASSUME_NONNULL_BEGIN
4747
*/
4848
+ (UIImage *)qmui_imageWithThemeManagerName:(__kindof NSObject<NSCopying> *)name provider:(UIImage *(^)(__kindof QMUIThemeManager *manager, __kindof NSObject<NSCopying> * _Nullable identifier, __kindof NSObject * _Nullable theme))provider;
4949

50+
/**
51+
内部用,标志 QMUIThemeImage 对 UIImage (QMUI) 里使用动态颜色生成动态图片的适配 hook 是否已生效。例如在配置表这种“加载时机特别早”的场景,此时 UIImage (QMUITheme) +load 方法尚未被调用,这些 hook 还没生效,此时如果你使用 [UIImage qmui_imageWithTintColor:dynamicColor] 得到的 image 是无法自动响应 theme 切换的。
52+
*/
53+
@property(class, nonatomic, assign) BOOL qmui_generatorSupportsDynamicColor;
54+
5055
@end
5156

5257
NS_ASSUME_NONNULL_END

QMUIKit/QMUIComponents/QMUITheme/UIImage+QMUITheme.m

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,11 @@ @implementation UIImage (QMUITheme)
388388

389389
QMUISynthesizeBOOLProperty(qmui_shouldUseSystemIMP, setQmui_shouldUseSystemIMP)
390390

391+
static BOOL generatorSupportsDynamicColor = NO;
392+
+ (BOOL)qmui_generatorSupportsDynamicColor {
393+
return generatorSupportsDynamicColor;
394+
}
395+
391396
+ (void)load {
392397
static dispatch_once_t onceToken;
393398
dispatch_once(&onceToken, ^{
@@ -486,6 +491,8 @@ + (void)load {
486491
};
487492
});
488493
}
494+
495+
generatorSupportsDynamicColor = YES;
489496
});
490497
}
491498

QMUIKit/QMUIKit.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#ifndef QMUIKit_h
1414
#define QMUIKit_h
1515

16-
static NSString * const QMUI_VERSION = @"4.4.2";
16+
static NSString * const QMUI_VERSION = @"4.4.3";
1717

1818
#if __has_include("CAAnimation+QMUI.h")
1919
#import "CAAnimation+QMUI.h"

QMUIKit/UIKitExtensions/NSString+QMUI.m

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,13 @@ - (NSString *)qmui_stringByEncodingUserInputQuery {
7070
}
7171

7272
- (NSString *)qmui_capitalizedString {
73-
if (self.length)
73+
if (self.length) {
74+
NSRange range = [self rangeOfComposedCharacterSequenceAtIndex:0];
75+
if (range.length > 1) {
76+
return self;// 说明这个字符没法大写
77+
}
7478
return [NSString stringWithFormat:@"%@%@", [self substringToIndex:1].uppercaseString, [self substringFromIndex:1]].copy;
79+
}
7580
return nil;
7681
}
7782

QMUIKit/UIKitExtensions/QMUIStringPrivate.m

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,7 @@ + (void)qmuisafety_NSString {
163163
BOOL isValidatedIndex = index <= selfObject.length;
164164
if (!isValidatedIndex) {
165165
NSString *logString = [NSString stringWithFormat:@"%@ 传入了一个超过字符串长度的 index: %@,原字符串为: %@(%@)", NSStringFromSelector(originCMD), @(index), selfObject, @(selfObject.length)];
166-
NSAssert(NO, logString);
167-
QMUILogWarn(@"QMUIStringSafety", @"%@", logString);
166+
QMUIAssert(NO, @"QMUIStringSafety", @"%@", logString);
168167
return @"";// 系统 substringFromIndex: 返回值的标志是 nonnull
169168
}
170169
}
@@ -176,8 +175,7 @@ + (void)qmuisafety_NSString {
176175
BOOL isValidatedIndex = range.location == index || NSMaxRange(range) == index;
177176
if (!isValidatedIndex) {
178177
NSString *logString = [NSString stringWithFormat:@"试图在 ComposedCharacterSequence 中间用 %@ 裁剪字符串,可能导致乱码、crash。原字符串为“%@”(%@),index 为 %@,命中的 ComposedCharacterSequence range 为 %@", NSStringFromSelector(originCMD), selfObject, @(selfObject.length), @(index), NSStringFromRange(range)];
179-
NSAssert(NO, logString);
180-
QMUILogWarn(@"QMUIStringSafety", @"%@", logString);
178+
QMUIAssert(NO, @"QMUIStringSafety", @"%@", logString);
181179
index = range.location;
182180
}
183181
}
@@ -200,8 +198,7 @@ + (void)qmuisafety_NSString {
200198
BOOL isValidatedIndex = index <= selfObject.length;
201199
if (!isValidatedIndex) {
202200
NSString *logString = [NSString stringWithFormat:@"%@ 传入了一个超过字符串长度的 index: %@,原字符串为: %@(%@)", NSStringFromSelector(originCMD), @(index), selfObject, @(selfObject.length)];
203-
NSAssert(NO, logString);
204-
QMUILogWarn(@"QMUIStringSafety", @"%@", logString);
201+
QMUIAssert(NO, @"QMUIStringSafety", @"%@", logString);
205202
return @"";// 系统 substringToIndex: 返回值的标志是 nonnull,但返回 nil 比返回 @"" 更安全
206203
}
207204
}
@@ -213,8 +210,7 @@ + (void)qmuisafety_NSString {
213210
BOOL isValidatedIndex = range.location == index;
214211
if (!isValidatedIndex) {
215212
NSString *logString = [NSString stringWithFormat:@"试图在 ComposedCharacterSequence 中间用 %@ 裁剪字符串,可能导致乱码、crash。原字符串为“%@”(%@),index 为 %@,命中的 ComposedCharacterSequence range 为 %@", NSStringFromSelector(originCMD), selfObject, @(selfObject.length), @(index), NSStringFromRange(range)];
216-
NSAssert(NO, logString);
217-
QMUILogWarn(@"QMUIStringSafety", @"%@", logString);
213+
QMUIAssert(NO, @"QMUIStringSafety", @"%@", logString);
218214
index = range.location;
219215
}
220216
}
@@ -238,8 +234,7 @@ + (void)qmuisafety_NSString {
238234
BOOL isValidddatedRange = NSMaxRange(range) <= selfObject.length;
239235
if (!isValidddatedRange) {
240236
NSString *logString = [NSString stringWithFormat:@"%@ 传入了一个超过字符串长度的 range: %@,原字符串为: %@(%@)", NSStringFromSelector(originCMD), NSStringFromRange(range), selfObject, @(selfObject.length)];
241-
NSAssert(NO, logString);
242-
QMUILogWarn(@"QMUIStringSafety", @"%@", logString);
237+
QMUIAssert(NO, @"QMUIStringSafety", @"%@", logString);
243238
return @"";// 系统 substringWithRange: 返回值的标志是 nonnull
244239
}
245240
}
@@ -251,8 +246,7 @@ + (void)qmuisafety_NSString {
251246
BOOL isValidddatedRange = range.length == 0 || NSEqualRanges(range, range2);
252247
if (!isValidddatedRange) {
253248
NSString *logString = [NSString stringWithFormat:@"试图在 ComposedCharacterSequence 中间用 %@ 裁剪字符串,可能导致乱码、crash。原字符串为“%@”(%@),range 为 %@,命中的 ComposedCharacterSequence range 为 %@", NSStringFromSelector(originCMD), selfObject, @(selfObject.length), NSStringFromRange(range), NSStringFromRange(range2)];
254-
NSAssert(NO, logString);
255-
QMUILogWarn(@"QMUIStringSafety", @"%@", logString);
249+
QMUIAssert(NO, @"QMUIStringSafety", @"%@", logString);
256250
range = range2;
257251
}
258252
}

QMUIKit/UIKitExtensions/UIImage+QMUI.m

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,12 @@ - (UIImage *)qmui_imageWithTintColor:(UIColor *)tintColor {
174174
CGContextSetFillColorWithColor(contextRef, tintColor.CGColor);
175175
CGContextFillRect(contextRef, CGRectMakeWithSize(self.size));
176176
}];
177-
if ([NSStringFromClass(tintColor.class) containsString:@"QMUIThemeColor"]) {
178-
QMUIAssert([NSStringFromClass(result.class) containsString:@"QMUIThemeImage"], @"UIImage (QMUI)", @"QMUIThemeColor 生成的图片却不是 QMUIThemeImage,可能是配置表应用的时机比 UIImage+QMUITheme 里重写 qmui_imageWithColor: 的时机还早,可能导致 theme 切换时无法刷新。");
177+
178+
SEL selector = NSSelectorFromString(@"qmui_generatorSupportsDynamicColor");
179+
if ([NSStringFromClass(tintColor.class) containsString:@"QMUIThemeColor"] && [UIImage respondsToSelector:selector]) {
180+
BOOL supports;
181+
[UIImage.class qmui_performSelector:selector withPrimitiveReturnValue:&supports];
182+
QMUIAssert(supports, @"UIImage (QMUI)", @"UIImage (QMUITheme) hook 尚未生效,QMUIThemeColor 生成的图片无法自动转成 QMUIThemeImage,可能导致 theme 切换时无法刷新。");
179183
}
180184
return result;
181185
}
@@ -575,8 +579,11 @@ + (UIImage *)qmui_imageWithColor:(UIColor *)color size:(CGSize)size cornerRadius
575579
CGContextFillRect(contextRef, CGRectMakeWithSize(size));
576580
}
577581
}];
578-
if ([NSStringFromClass(color.class) containsString:@"QMUIThemeColor"]) {
579-
QMUIAssert([NSStringFromClass(result.class) containsString:@"QMUIThemeImage"], @"UIImage (QMUI)", @"QMUIThemeColor 生成的图片却不是 QMUIThemeImage,可能是配置表应用的时机比 UIImage+QMUITheme 里重写 qmui_imageWithColor: 的时机还早,可能导致 theme 切换时无法刷新。");
582+
SEL selector = NSSelectorFromString(@"qmui_generatorSupportsDynamicColor");
583+
if ([NSStringFromClass(color.class) containsString:@"QMUIThemeColor"] && [UIImage respondsToSelector:selector]) {
584+
BOOL supports;
585+
[UIImage.class qmui_performSelector:selector withPrimitiveReturnValue:&supports];
586+
QMUIAssert(supports, @"UIImage (QMUI)", @"UIImage (QMUITheme) hook 尚未生效,QMUIThemeColor 生成的图片无法自动转成 QMUIThemeImage,可能导致 theme 切换时无法刷新。");
580587
}
581588
return result;
582589
}

QMUIKit/UIKitExtensions/UISlider+QMUI.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,11 @@ NS_ASSUME_NONNULL_BEGIN
5050
@property(nonatomic, assign) NSUInteger qmui_step;
5151

5252
/// 在设置 qmui_numberOfSteps 时会创建对应个数的 QMUISliderStepControl,而通过这个 configuration block 可以配置每一个 stepControl 的属性
53-
@property(nullable, nonatomic, copy) void (^qmui_stepControlConfiguration)(UISlider *slider, QMUISliderStepControl *stepControl, NSUInteger index);
53+
@property(nullable, nonatomic, copy) void (^qmui_stepControlConfiguration)(__kindof UISlider *slider, QMUISliderStepControl *stepControl, NSUInteger index);
54+
55+
/// 当使用了 step 功能时,可通过这个 block 监听 step 的变化(只有 step 的值改变时才会触发),获取当前 step 的值请调用 slider.qmui_step,获取变化前的 step 值请访问参数 precedingStep。
56+
/// @note 在系统的 UIControlEventValueChanged 里获取 slider.qmui_step 也可以,但因为 slider.continuous 默认是 YES,所以拖动过程中 UIControlEventValueChanged 会触发很多次,但 step 不一定有变化,所以用专门的 block 监听会更方便高效一点。
57+
@property(nullable, nonatomic, copy) void (^qmui_stepDidChangeBlock)(__kindof UISlider *slider, NSUInteger precedingStep);
5458
@end
5559

5660
@interface QMUISliderStepControl : UIControl

0 commit comments

Comments
 (0)