Various improvements

This commit is contained in:
Isaac 2025-09-23 20:49:12 +08:00
parent bf3ec930bc
commit 3684c6ca15
34 changed files with 593 additions and 339 deletions

View file

@ -4,6 +4,7 @@
double animationDurationFactorImpl();
CABasicAnimation * _Nonnull makeSpringAnimationImpl(NSString * _Nonnull keyPath);
CABasicAnimation * _Nonnull make26SpringAnimationImpl(NSString * _Nonnull keyPath, double duration);
CABasicAnimation * _Nonnull makeSpringBounceAnimationImpl(NSString * _Nonnull keyPath, CGFloat initialVelocity, CGFloat damping);
CGFloat springAnimationValueAtImpl(CABasicAnimation * _Nonnull animation, CGFloat t);
@ -36,3 +37,5 @@ void setLayerDisableScreenshots(CALayer * _Nonnull layer, bool disableScreenshot
bool getLayerDisableScreenshots(CALayer * _Nonnull layer);
void setLayerContentsMaskMode(CALayer * _Nonnull layer, bool maskMode);
void setMonochromaticEffectImpl(UIView * _Nonnull view, bool isEnabled);

View file

@ -61,6 +61,24 @@ CABasicAnimation * _Nonnull makeSpringAnimationImpl(NSString * _Nonnull keyPath)
return springAnimation;
}
CABasicAnimation * _Nonnull make26SpringAnimationImpl(NSString * _Nonnull keyPath, double duration) {
CASpringAnimation *springAnimation = [CASpringAnimation animationWithKeyPath:keyPath];
springAnimation.mass = 1.0f;
springAnimation.stiffness = 555.027;
springAnimation.damping = 47.118;
springAnimation.duration = duration;
springAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
if (@available(iOS 17.0, *)) {
springAnimation.allowsOverdamping = false;
}
if (@available(iOS 15.0, *)) {
[springAnimation setValue:@(1048619) forKey:@"highFrameRateReason"];
springAnimation.preferredFrameRateRange = CAFrameRateRangeMake(80.0, 120.0, 120.0);
}
return springAnimation;
}
CABasicAnimation * _Nonnull makeSpringBounceAnimationImpl(NSString * _Nonnull keyPath, CGFloat initialVelocity, CGFloat damping) {
CASpringAnimation *springAnimation = [CASpringAnimation animationWithKeyPath:keyPath];
springAnimation.mass = 5.0f;
@ -134,6 +152,20 @@ static void setBoolField(NSObject *object, NSString *name, BOOL value) {
[inv invoke];
}
static void setLongLongField(NSObject *object, NSString *name, long long value) {
SEL selector = NSSelectorFromString(name);
NSMethodSignature *signature = [[object class] instanceMethodSignatureForSelector:selector];
if (signature == nil) {
return;
}
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:signature];
[inv setSelector:selector];
[inv setArgument:&value atIndex:2];
[inv setTarget:object];
[inv invoke];
}
UIBlurEffect *makeCustomZoomBlurEffectImpl(bool isLight) {
if (@available(iOS 13.0, *)) {
if (isLight) {
@ -299,3 +331,27 @@ void setLayerContentsMaskMode(CALayer * _Nonnull layer, bool maskMode) {
[layer setValue:@"RGBA" forKey:key];
}
}
void setMonochromaticEffectImpl(UIView * _Nonnull view, bool isEnabled) {
if (@available(iOS 26.0, *)) {
static NSString *key1 = nil;
static NSString *key2 = nil;
static NSString *key3 = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
key1 = [[@"_" stringByAppendingString:@"setAllows"] stringByAppendingString:@"MonochromaticTreatment:"];
key2 = [[@"_" stringByAppendingString:@"setEnable"] stringByAppendingString:@"MonochromaticTreatment:"];
key3 = [[@"_" stringByAppendingString:@"set"] stringByAppendingString:@"MonochromaticTreatment:"];
});
if (isEnabled) {
setBoolField(view, key1, true);
setBoolField(view, key2, true);
setLongLongField(view, key3, 2);
} else {
setBoolField(view, key1, false);
setBoolField(view, key2, false);
setLongLongField(view, key3, 0);
}
}
}