diff --git a/AsyncImageView/AsyncImageView.swift b/AsyncImageView/AsyncImageView.swift index 0546fc9..8c41a6a 100644 --- a/AsyncImageView/AsyncImageView.swift +++ b/AsyncImageView/AsyncImageView.swift @@ -38,6 +38,7 @@ open class AsyncImageView< private let requestsObserver: Signal.Observer private let imageCreationScheduler: ReactiveSwift.Scheduler + private let animatesImageChanges: Bool private var disposable: Disposable? @@ -46,10 +47,12 @@ open class AsyncImageView< renderer: Renderer, placeholderRenderer: PlaceholderRenderer? = nil, uiScheduler: ReactiveSwift.Scheduler = UIScheduler(), - imageCreationScheduler: ReactiveSwift.Scheduler = QueueScheduler() + imageCreationScheduler: ReactiveSwift.Scheduler = QueueScheduler(), + animatesImageChanges: Bool = true ) { (self.requestsSignal, self.requestsObserver) = Signal.pipe() self.imageCreationScheduler = imageCreationScheduler + self.animatesImageChanges = animatesImageChanges super.init(frame: initialFrame) @@ -124,7 +127,7 @@ open class AsyncImageView< private func updateImage(_ result: Renderer.RenderResult?) { if let result = result { - if result.cacheHit { + if result.cacheHit || !self.animatesImageChanges { self.image = result.image } else { UIView.transition( diff --git a/AsyncImageViewTests/AsyncImageViewTests.swift b/AsyncImageViewTests/AsyncImageViewTests.swift index 610475a..024206c 100644 --- a/AsyncImageViewTests/AsyncImageViewTests.swift +++ b/AsyncImageViewTests/AsyncImageViewTests.swift @@ -41,6 +41,19 @@ struct AsyncImageViewBehaviorTests { await fixture.verifyRenderedImage() } + @Test + func canDisableImageChangeAnimations() async { + let fixture = ImageViewFixture( + size: CGSize(width: 10, height: 10), + animatesImageChanges: false + ) + + fixture.view.data = .a + + await fixture.verifyRenderedImage() + #expect(fixture.view.layer.animationKeys()?.isEmpty != false) + } + @Test func updatingDataUpdatesImage() async { let fixture = ImageViewFixture(size: CGSize(width: 10, height: 10)) @@ -237,13 +250,18 @@ private final class ImageViewFixture { let view: ViewType private let window = UIWindow() - init(size: CGSize = .zero, data: TestData? = nil) { + init( + size: CGSize = .zero, + data: TestData? = nil, + animatesImageChanges: Bool = true + ) { self.view = ViewType( initialFrame: CGRect(origin: .zero, size: size), renderer: self.renderer, placeholderRenderer: nil, uiScheduler: QueueScheduler(targeting: DispatchQueue.main), - imageCreationScheduler: ImmediateScheduler() + imageCreationScheduler: ImmediateScheduler(), + animatesImageChanges: animatesImageChanges ) self.window.addSubview(self.view) self.view.data = data