#import #import #if TARGET_IPHONE_SIMULATOR #import #endif namespace reanimated { CGFloat getUIAnimationDragCoefficient(void) { static float (*UIAnimationDragCoefficient)(void) = NULL; #if TARGET_IPHONE_SIMULATOR static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ UIAnimationDragCoefficient = (float (*)(void))dlsym(RTLD_DEFAULT, "UIAnimationDragCoefficient"); }); #endif return UIAnimationDragCoefficient ? UIAnimationDragCoefficient() : 1.f; } CFTimeInterval calculateTimestampWithSlowAnimations(CFTimeInterval currentTimestamp) { #if TARGET_IPHONE_SIMULATOR static CFTimeInterval dragCoefChangedTimestamp = CACurrentMediaTime(); static CGFloat previousDragCoef = getUIAnimationDragCoefficient(); const CGFloat dragCoef = getUIAnimationDragCoefficient(); if (previousDragCoef != dragCoef) { previousDragCoef = dragCoef; dragCoefChangedTimestamp = CACurrentMediaTime(); } const bool areSlowAnimationsEnabled = dragCoef != 1.f; if (areSlowAnimationsEnabled) { return (dragCoefChangedTimestamp + (currentTimestamp - dragCoefChangedTimestamp) / dragCoef); } else { return currentTimestamp; } #else return currentTimestamp; #endif } } // namespace reanimated