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.layoutParams = params
strongSelf.listNode.backgroundColor = item.theme.list.itemBlocksBackgroundColor
strongSelf.backgroundNode.backgroundColor = item.theme.list.itemBlocksBackgroundColor
strongSelf.topStripeNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor
strongSelf.bottomStripeNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor
if strongSelf.backgroundNode.supernode == nil {
strongSelf.containerNode.insertSubnode(strongSelf.backgroundNode, at: 0)
}
@ -828,10 +827,11 @@ class ThemeCarouselThemeItemNode: ListViewItemNode, ItemListItemNode {
self.snapshotView = snapshotView
}
self.listNode.forEachVisibleItemNode { node in
self.listNode.enumerateItemNodes { node in
if let node = node as? ThemeCarouselThemeItemIconNode {
node.prepareCrossfadeTransition()
}
return true
}
}
@ -839,22 +839,23 @@ class ThemeCarouselThemeItemNode: ListViewItemNode, ItemListItemNode {
guard self.snapshotView?.layer.animationKeys()?.isEmpty ?? true else {
return
}
var views: [UIView] = []
if let snapshotView = self.snapshotView {
views.append(snapshotView)
self.snapshotView = nil
}
self.listNode.forEachVisibleItemNode { node in
self.listNode.enumerateItemNodes { node in
if let node = node as? ThemeCarouselThemeItemIconNode {
if let snapshotView = node.snapshotView {
views.append(snapshotView)
node.snapshotView = nil
}
}
return true
}
UIView.animate(withDuration: 0.3, animations: {
for view in views {
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) {
if let view = view {
if var leftOffset = leftOffset {
leftOffset += UIScreenPixel
if let leftOffset = leftOffset {
if let view = view.snapshotView(afterScreenUpdates: false) {
let clipView = UIView()
clipView.clipsToBounds = true
@ -1306,13 +1304,13 @@ public final class ThemeSettingsCrossfadeController: ViewController {
if let topOffset = topOffset, let bottomOffset = bottomOffset {
var frame = view.frame
frame.origin.y = topOffset
frame.size.width = leftOffset
frame.size.width = leftOffset + sideInset
frame.size.height = bottomOffset - topOffset
clipView.frame = frame
frame = view.frame
frame.origin.y = -topOffset
frame.size.width = leftOffset
frame.size.width = leftOffset + sideInset
frame.size.height = bottomOffset
view.frame = frame
}
@ -1322,7 +1320,7 @@ public final class ThemeSettingsCrossfadeController: ViewController {
}
if sideInset > 0.0 {
if let view = view.snapshotView(afterScreenUpdates: false) {
if let view = view.snapshotView(afterScreenUpdates: false), leftOffset == nil {
let clipView = UIView()
clipView.clipsToBounds = true
clipView.addSubview(view)

View File

@ -154,6 +154,7 @@ private final class EffectImageLayer: SimpleLayer, GradientBackgroundPatternOver
}
private var isUsingSoftlight: Bool = false
private var useFilter: Bool = false
var suspendCompositionUpdates: Bool = false
private var needsCompositionUpdate: Bool = false
@ -172,10 +173,11 @@ private final class EffectImageLayer: SimpleLayer, GradientBackgroundPatternOver
useSoftlight = true
useFilter = false
}
if self.isUsingSoftlight != useSoftlight {
if self.isUsingSoftlight != useSoftlight || self.useFilter != useFilter {
self.isUsingSoftlight = useSoftlight
self.useFilter = useFilter
if self.isUsingSoftlight && useFilter {
if self.isUsingSoftlight && self.useFilter {
self.compositingFilter = "softLightBlendMode"
} else {
self.compositingFilter = nil
@ -842,10 +844,6 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
}
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)
var isReady: Signal<Bool, NoError> {
return self._isReady.get()
@ -1308,13 +1306,6 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
}
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 {
self.updateScale()