chore: Initial clean commit

- Removed YuMi/Library/ (138 MB, not tracked)
- Removed YuMi/Resources/ (23 MB, not tracked)
- Removed old version assets (566 files, not tracked)
- Excluded Pods/, xcuserdata/ and other build artifacts
- Clean repository optimized for company server deployment
This commit is contained in:
edwinQQQ
2025-10-09 16:19:14 +08:00
commit a35a711be6
5582 changed files with 408913 additions and 0 deletions

View File

@@ -0,0 +1,37 @@
//
// UIView+GradientLayer.h
// YuMi
//
// Created by P on 2024/11/18.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UIView (GradientLayer)
/// 为视图添加渐变背景
/// @param colors 渐变颜色数组 (NSArray<UIColor *> *)
/// @param startPoint 渐变起点 (CGPoint)
/// @param endPoint 渐变终点 (CGPoint)
/// @param cornerRadius 圆角半径 (CGFloat)
- (void)addGradientBackgroundWithColors:(NSArray<UIColor *> *)colors
startPoint:(CGPoint)startPoint
endPoint:(CGPoint)endPoint
cornerRadius:(CGFloat)cornerRadius;
/// 移除渐变背景
- (void)removeGradientBackground;
/// 更新渐变背景
/// @param colors 渐变颜色数组 (NSArray<UIColor *> *)
/// @param startPoint 渐变起点 (CGPoint)
/// @param endPoint 渐变终点 (CGPoint)
- (void)updateGradientBackgroundWithColors:(NSArray<UIColor *> *)colors
startPoint:(CGPoint)startPoint
endPoint:(CGPoint)endPoint;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,120 @@
//
// UIView+GradientLayer.m
// YuMi
//
// Created by P on 2024/11/18.
//
#import "UIView+GradientLayer.h"
#import <QuartzCore/QuartzCore.h>
@implementation UIView (GradientLayer)
static NSString * const kGradientLayerName = @"GradientLayer";
static void *kGradientObserverKey = &kGradientObserverKey;
//
- (void)addGradientBackgroundWithColors:(NSArray<UIColor *> *)colors
startPoint:(CGPoint)startPoint
endPoint:(CGPoint)endPoint
cornerRadius:(CGFloat)cornerRadius {
// KVO
[self removeGradientBackground];
//
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.name = kGradientLayerName;
gradientLayer.colors = [self cgColorsFromUIColors:colors];
gradientLayer.startPoint = startPoint;
gradientLayer.endPoint = endPoint;
gradientLayer.cornerRadius = cornerRadius;
// frame
gradientLayer.frame = self.bounds;
[self.layer insertSublayer:gradientLayer atIndex:0];
// KVO
[self setupLayoutObserverForGradientLayer:gradientLayer];
}
//
- (void)updateGradientBackgroundWithColors:(NSArray<UIColor *> *)colors
startPoint:(CGPoint)startPoint
endPoint:(CGPoint)endPoint {
CAGradientLayer *gradientLayer = [self gradientLayer];
if (gradientLayer) {
gradientLayer.colors = [self cgColorsFromUIColors:colors];
gradientLayer.startPoint = startPoint;
gradientLayer.endPoint = endPoint;
}
}
//
- (void)removeGradientBackground {
//
CAGradientLayer *gradientLayer = [self gradientLayer];
if (gradientLayer) {
[gradientLayer removeFromSuperlayer];
}
// KVO
if ([self hasAddedObserver]) {
[self removeObserver:self forKeyPath:@"bounds"];
[self setHasAddedObserver:NO];
}
}
//
- (CAGradientLayer *)gradientLayer {
for (CALayer *layer in self.layer.sublayers) {
if ([layer.name isEqualToString:kGradientLayerName] &&
[layer isKindOfClass:[CAGradientLayer class]]) {
return (CAGradientLayer *)layer;
}
}
return nil;
}
// KVO
- (void)setupLayoutObserverForGradientLayer:(CAGradientLayer *)gradientLayer {
if (![self hasAddedObserver]) {
[self addObserver:self forKeyPath:@"bounds" options:NSKeyValueObservingOptionNew context:(__bridge void *)gradientLayer];
[self setHasAddedObserver:YES];
}
}
// KVO
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary<NSKeyValueChangeKey,id> *)change
context:(void *)context {
if ([keyPath isEqualToString:@"bounds"]) {
CAGradientLayer *gradientLayer = (__bridge CAGradientLayer *)context;
gradientLayer.frame = self.bounds; // frame
} else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
//
- (NSArray *)cgColorsFromUIColors:(NSArray<UIColor *> *)colors {
NSMutableArray *cgColors = [NSMutableArray array];
for (UIColor *color in colors) {
[cgColors addObject:(id)color.CGColor];
}
return [cgColors copy];
}
// KVO
- (BOOL)hasAddedObserver {
return [objc_getAssociatedObject(self, kGradientObserverKey) boolValue];
}
// KVO
- (void)setHasAddedObserver:(BOOL)added {
objc_setAssociatedObject(self, kGradientObserverKey, @(added), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end