Fix theme crossfade animation

This commit is contained in:
Ilya Laktyushin 2023-03-19 17:26:23 +04:00
parent 03ae2197ac
commit 56191f4c0b
3 changed files with 16 additions and 26 deletions

View File

@ -711,11 +711,10 @@ class ThemeCarouselThemeItemNode: ListViewItemNode, ItemListItemNode {
strongSelf.item = item strongSelf.item = item
strongSelf.layoutParams = params strongSelf.layoutParams = params
strongSelf.listNode.backgroundColor = item.theme.list.itemBlocksBackgroundColor
strongSelf.backgroundNode.backgroundColor = item.theme.list.itemBlocksBackgroundColor strongSelf.backgroundNode.backgroundColor = item.theme.list.itemBlocksBackgroundColor
strongSelf.topStripeNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor strongSelf.topStripeNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor
strongSelf.bottomStripeNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor strongSelf.bottomStripeNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor
if strongSelf.backgroundNode.supernode == nil { if strongSelf.backgroundNode.supernode == nil {
strongSelf.containerNode.insertSubnode(strongSelf.backgroundNode, at: 0) strongSelf.containerNode.insertSubnode(strongSelf.backgroundNode, at: 0)
} }
@ -828,10 +827,11 @@ class ThemeCarouselThemeItemNode: ListViewItemNode, ItemListItemNode {
self.snapshotView = snapshotView self.snapshotView = snapshotView
} }
self.listNode.forEachVisibleItemNode { node in self.listNode.enumerateItemNodes { node in
if let node = node as? ThemeCarouselThemeItemIconNode { if let node = node as? ThemeCarouselThemeItemIconNode {
node.prepareCrossfadeTransition() node.prepareCrossfadeTransition()
} }
return true
} }
} }
@ -839,22 +839,23 @@ class ThemeCarouselThemeItemNode: ListViewItemNode, ItemListItemNode {
guard self.snapshotView?.layer.animationKeys()?.isEmpty ?? true else { guard self.snapshotView?.layer.animationKeys()?.isEmpty ?? true else {
return return
} }
var views: [UIView] = [] var views: [UIView] = []
if let snapshotView = self.snapshotView { if let snapshotView = self.snapshotView {
views.append(snapshotView) views.append(snapshotView)
self.snapshotView = nil self.snapshotView = nil
} }
self.listNode.forEachVisibleItemNode { node in self.listNode.enumerateItemNodes { node in
if let node = node as? ThemeCarouselThemeItemIconNode { if let node = node as? ThemeCarouselThemeItemIconNode {
if let snapshotView = node.snapshotView { if let snapshotView = node.snapshotView {
views.append(snapshotView) views.append(snapshotView)
node.snapshotView = nil node.snapshotView = nil
} }
} }
return true
} }
UIView.animate(withDuration: 0.3, animations: { UIView.animate(withDuration: 0.3, animations: {
for view in views { for view in views {
view.alpha = 0.0 view.alpha = 0.0

View File

@ -1292,9 +1292,7 @@ public final class ThemeSettingsCrossfadeController: ViewController {
public init(view: UIView? = nil, topOffset: CGFloat? = nil, bottomOffset: CGFloat? = nil, leftOffset: CGFloat? = nil, sideInset: CGFloat = 0.0) { public init(view: UIView? = nil, topOffset: CGFloat? = nil, bottomOffset: CGFloat? = nil, leftOffset: CGFloat? = nil, sideInset: CGFloat = 0.0) {
if let view = view { if let view = view {
if var leftOffset = leftOffset { if let leftOffset = leftOffset {
leftOffset += UIScreenPixel
if let view = view.snapshotView(afterScreenUpdates: false) { if let view = view.snapshotView(afterScreenUpdates: false) {
let clipView = UIView() let clipView = UIView()
clipView.clipsToBounds = true clipView.clipsToBounds = true
@ -1306,13 +1304,13 @@ public final class ThemeSettingsCrossfadeController: ViewController {
if let topOffset = topOffset, let bottomOffset = bottomOffset { if let topOffset = topOffset, let bottomOffset = bottomOffset {
var frame = view.frame var frame = view.frame
frame.origin.y = topOffset frame.origin.y = topOffset
frame.size.width = leftOffset frame.size.width = leftOffset + sideInset
frame.size.height = bottomOffset - topOffset frame.size.height = bottomOffset - topOffset
clipView.frame = frame clipView.frame = frame
frame = view.frame frame = view.frame
frame.origin.y = -topOffset frame.origin.y = -topOffset
frame.size.width = leftOffset frame.size.width = leftOffset + sideInset
frame.size.height = bottomOffset frame.size.height = bottomOffset
view.frame = frame view.frame = frame
} }
@ -1322,7 +1320,7 @@ public final class ThemeSettingsCrossfadeController: ViewController {
} }
if sideInset > 0.0 { if sideInset > 0.0 {
if let view = view.snapshotView(afterScreenUpdates: false) { if let view = view.snapshotView(afterScreenUpdates: false), leftOffset == nil {
let clipView = UIView() let clipView = UIView()
clipView.clipsToBounds = true clipView.clipsToBounds = true
clipView.addSubview(view) clipView.addSubview(view)

View File

@ -154,6 +154,7 @@ private final class EffectImageLayer: SimpleLayer, GradientBackgroundPatternOver
} }
private var isUsingSoftlight: Bool = false private var isUsingSoftlight: Bool = false
private var useFilter: Bool = false
var suspendCompositionUpdates: Bool = false var suspendCompositionUpdates: Bool = false
private var needsCompositionUpdate: Bool = false private var needsCompositionUpdate: Bool = false
@ -172,10 +173,11 @@ private final class EffectImageLayer: SimpleLayer, GradientBackgroundPatternOver
useSoftlight = true useSoftlight = true
useFilter = false useFilter = false
} }
if self.isUsingSoftlight != useSoftlight { if self.isUsingSoftlight != useSoftlight || self.useFilter != useFilter {
self.isUsingSoftlight = useSoftlight self.isUsingSoftlight = useSoftlight
self.useFilter = useFilter
if self.isUsingSoftlight && useFilter { if self.isUsingSoftlight && self.useFilter {
self.compositingFilter = "softLightBlendMode" self.compositingFilter = "softLightBlendMode"
} else { } else {
self.compositingFilter = nil self.compositingFilter = nil
@ -842,10 +844,6 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
} }
private static var cachedSharedPattern: (PatternKey, UIImage)? private static var cachedSharedPattern: (PatternKey, UIImage)?
//private var inlineAnimationNodes: [(AnimatedStickerNode, CGPoint)] = []
//private let hierarchyTrackingLayer = HierarchyTrackingLayer()
//private var activateInlineAnimationTimer: SwiftSignalKit.Timer?
private let _isReady = ValuePromise<Bool>(false, ignoreRepeated: true) private let _isReady = ValuePromise<Bool>(false, ignoreRepeated: true)
var isReady: Signal<Bool, NoError> { var isReady: Signal<Bool, NoError> {
return self._isReady.get() return self._isReady.get()
@ -1308,13 +1306,6 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
} }
self.loadPatternForSizeIfNeeded(size: size, displayMode: displayMode, transition: transition) self.loadPatternForSizeIfNeeded(size: size, displayMode: displayMode, transition: transition)
/*for (animationNode, relativePosition) in self.inlineAnimationNodes {
let sizeNorm = CGSize(width: 1440, height: 2960)
let animationSize = CGSize(width: 512.0 / sizeNorm.width * size.width, height: 512.0 / sizeNorm.height * size.height)
animationNode.frame = CGRect(origin: CGPoint(x: relativePosition.x / sizeNorm.width * size.width, y: relativePosition.y / sizeNorm.height * size.height), size: animationSize)
animationNode.updateLayout(size: animationNode.frame.size)
}*/
if isFirstLayout && !self.frame.isEmpty { if isFirstLayout && !self.frame.isEmpty {
self.updateScale() self.updateScale()