/* * This file is part of the SDWebImage package. * (c) Olivier Poitrey * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ #import "SDWebImageCompat.h" #if SD_UIKIT || SD_MAC #import "SDImageCache.h" #if SD_UIKIT typedef UIViewAnimationOptions SDWebImageAnimationOptions; #else typedef NS_OPTIONS(NSUInteger, SDWebImageAnimationOptions) { SDWebImageAnimationOptionAllowsImplicitAnimation = 1 << 0, // specify `allowsImplicitAnimation` for the `NSAnimationContext` SDWebImageAnimationOptionCurveEaseInOut = 0 << 16, // default SDWebImageAnimationOptionCurveEaseIn = 1 << 16, SDWebImageAnimationOptionCurveEaseOut = 2 << 16, SDWebImageAnimationOptionCurveLinear = 3 << 16, SDWebImageAnimationOptionTransitionNone = 0 << 20, // default SDWebImageAnimationOptionTransitionFlipFromLeft = 1 << 20, SDWebImageAnimationOptionTransitionFlipFromRight = 2 << 20, SDWebImageAnimationOptionTransitionCurlUp = 3 << 20, SDWebImageAnimationOptionTransitionCurlDown = 4 << 20, SDWebImageAnimationOptionTransitionCrossDissolve = 5 << 20, SDWebImageAnimationOptionTransitionFlipFromTop = 6 << 20, SDWebImageAnimationOptionTransitionFlipFromBottom = 7 << 20, }; #endif typedef void (^SDWebImageTransitionPreparesBlock)(__kindof UIView * _Nonnull view, UIImage * _Nullable image, NSData * _Nullable imageData, SDImageCacheType cacheType, NSURL * _Nullable imageURL); typedef void (^SDWebImageTransitionAnimationsBlock)(__kindof UIView * _Nonnull view, UIImage * _Nullable image); typedef void (^SDWebImageTransitionCompletionBlock)(BOOL finished); /** This class is used to provide a transition animation after the view category load image finished. Use this on `sd_imageTransition` in UIView+WebCache.h for UIKit(iOS & tvOS), we use `+[UIView transitionWithView:duration:options:animations:completion]` for transition animation. for AppKit(macOS), we use `+[NSAnimationContext runAnimationGroup:completionHandler:]` for transition animation. You can call `+[NSAnimationContext currentContext]` to grab the context during animations block. @note These transition are provided for basic usage. If you need complicated animation, consider to directly use Core Animation or use `SDWebImageAvoidAutoSetImage` and implement your own after image load finished. */ @interface SDWebImageTransition : NSObject /** By default, we set the image to the view at the beginning of the animations. You can disable this and provide custom set image process */ @property (nonatomic, assign) BOOL avoidAutoSetImage; /** The duration of the transition animation, measured in seconds. Defaults to 0.5. */ @property (nonatomic, assign) NSTimeInterval duration; /** The timing function used for all animations within this transition animation (macOS). */ @property (nonatomic, strong, nullable) CAMediaTimingFunction *timingFunction API_UNAVAILABLE(ios, tvos, watchos) API_DEPRECATED("Use SDWebImageAnimationOptions instead, or grab NSAnimationContext.currentContext and modify the timingFunction", macos(10.10, 10.10)); /** A mask of options indicating how you want to perform the animations. */ @property (nonatomic, assign) SDWebImageAnimationOptions animationOptions; /** A block object to be executed before the animation sequence starts. */ @property (nonatomic, copy, nullable) SDWebImageTransitionPreparesBlock prepares; /** A block object that contains the changes you want to make to the specified view. */ @property (nonatomic, copy, nullable) SDWebImageTransitionAnimationsBlock animations; /** A block object to be executed when the animation sequence ends. */ @property (nonatomic, copy, nullable) SDWebImageTransitionCompletionBlock completion; @end /** Convenience way to create transition. Remember to specify the duration if needed. for UIKit, these transition just use the correspond `animationOptions`. By default we enable `UIViewAnimationOptionAllowUserInteraction` to allow user interaction during transition. for AppKit, these transition use Core Animation in `animations`. So your view must be layer-backed. Set `wantsLayer = YES` before you apply it. */ @interface SDWebImageTransition (Conveniences) /// Fade-in transition. @property (nonatomic, class, nonnull, readonly) SDWebImageTransition *fadeTransition; /// Flip from left transition. @property (nonatomic, class, nonnull, readonly) SDWebImageTransition *flipFromLeftTransition; /// Flip from right transition. @property (nonatomic, class, nonnull, readonly) SDWebImageTransition *flipFromRightTransition; /// Flip from top transition. @property (nonatomic, class, nonnull, readonly) SDWebImageTransition *flipFromTopTransition; /// Flip from bottom transition. @property (nonatomic, class, nonnull, readonly) SDWebImageTransition *flipFromBottomTransition; /// Curl up transition. @property (nonatomic, class, nonnull, readonly) SDWebImageTransition *curlUpTransition; /// Curl down transition. @property (nonatomic, class, nonnull, readonly) SDWebImageTransition *curlDownTransition; /// Fade-in transition with duration. /// @param duration transition duration, use ease-in-out + (nonnull instancetype)fadeTransitionWithDuration:(NSTimeInterval)duration NS_SWIFT_NAME(fade(duration:)); /// Flip from left transition with duration. /// @param duration transition duration, use ease-in-out + (nonnull instancetype)flipFromLeftTransitionWithDuration:(NSTimeInterval)duration NS_SWIFT_NAME(flipFromLeft(duration:)); /// Flip from right transition with duration. /// @param duration transition duration, use ease-in-out + (nonnull instancetype)flipFromRightTransitionWithDuration:(NSTimeInterval)duration NS_SWIFT_NAME(flipFromRight(duration:)); /// Flip from top transition with duration. /// @param duration transition duration, use ease-in-out + (nonnull instancetype)flipFromTopTransitionWithDuration:(NSTimeInterval)duration NS_SWIFT_NAME(flipFromTop(duration:)); /// Flip from bottom transition with duration. /// @param duration transition duration, use ease-in-out + (nonnull instancetype)flipFromBottomTransitionWithDuration:(NSTimeInterval)duration NS_SWIFT_NAME(flipFromBottom(duration:)); /// Curl up transition with duration. /// @param duration transition duration, use ease-in-out + (nonnull instancetype)curlUpTransitionWithDuration:(NSTimeInterval)duration NS_SWIFT_NAME(curlUp(duration:)); /// Curl down transition with duration. /// @param duration transition duration, use ease-in-out + (nonnull instancetype)curlDownTransitionWithDuration:(NSTimeInterval)duration NS_SWIFT_NAME(curlDown(duration:)); @end #endif