diff --git a/submodules/Display/Source/UIKitUtils.swift b/submodules/Display/Source/UIKitUtils.swift index bd9bff677a..5b1b2fd80d 100644 --- a/submodules/Display/Source/UIKitUtils.swift +++ b/submodules/Display/Source/UIKitUtils.swift @@ -753,6 +753,12 @@ public extension CALayer { } } +public extension CALayer { + static func blur() -> NSObject? { + return makeBlurFilter() + } +} + public extension CALayer { var layerTintColor: CGColor? { get { diff --git a/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift b/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift index 41f32d4b67..7a5ba263b8 100644 --- a/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift @@ -194,6 +194,7 @@ public final class StoryPeerListComponent: Component { private final class VisibleItem { let view = ComponentView() + var hasBlur: Bool = false init() { } @@ -369,6 +370,8 @@ public final class StoryPeerListComponent: Component { private var currentTitleWidth: CGFloat = 0.0 private var currentActivityFraction: CGFloat = 0.0 + private var sharedBlurEffect: NSObject? + public override init(frame: CGRect) { self.collapsedButton = HighlightableButton() @@ -690,6 +693,21 @@ public final class StoryPeerListComponent: Component { expandBoundsFraction = 0.0 } + let blurRadius: CGFloat = collapsedState.sideAlphaFraction * 0.0 + (1.0 - collapsedState.sideAlphaFraction) * 14.0 + if blurRadius == 0.0 { + self.sharedBlurEffect = nil + } else { + if let current = self.sharedBlurEffect, (current.value(forKey: "inputRadius") as? NSNumber)?.doubleValue == blurRadius { + } else { + if let sharedBlurEffect = CALayer.blur() { + sharedBlurEffect.setValue(blurRadius as NSNumber, forKey: "inputRadius") + self.sharedBlurEffect = sharedBlurEffect + } else { + self.sharedBlurEffect = nil + } + } + } + var targetCollapsedContentWidth: CGFloat = 0.0 if collapsedItemCount > 0 { targetCollapsedContentWidth = 1.0 * collapsedItemWidth + (collapsedItemDistance) * max(0.0, collapsedItemCount - 1.0) @@ -819,8 +837,8 @@ public final class StoryPeerListComponent: Component { continue } - //let isReallyVisible = effectiveVisibleBounds.intersects(regularItemFrame) - //let _ = isReallyVisible + let isReallyVisible = effectiveVisibleBounds.intersects(regularItemFrame) + let _ = isReallyVisible validIds.append(itemSet.peer.id) @@ -943,6 +961,16 @@ public final class StoryPeerListComponent: Component { itemTransition.setScale(view: itemView.backgroundContainer, scale: 1.0) itemView.updateIsPreviewing(isPreviewing: self.previewedItemId == itemSet.peer.id) + + if (i >= collapseStartIndex && i <= collapseEndIndex) || !isReallyVisible { + itemView.layer.filters = nil + } else { + if let sharedBlurEffect = self.sharedBlurEffect { + itemView.layer.filters = [sharedBlurEffect] + } else { + itemView.layer.filters = nil + } + } } } @@ -1067,8 +1095,6 @@ public final class StoryPeerListComponent: Component { itemTransition.setFrame(view: itemView.backgroundContainer, frame: measuredItem.itemFrame) itemTransition.setAlpha(view: itemView.backgroundContainer, alpha: itemAlpha) itemTransition.setScale(view: itemView.backgroundContainer, scale: 1.0) - - itemView.updateIsPreviewing(isPreviewing: self.previewedItemId == itemSet.peer.id) } } diff --git a/submodules/UIKitRuntimeUtils/Source/UIKitRuntimeUtils/UIKitUtils.h b/submodules/UIKitRuntimeUtils/Source/UIKitRuntimeUtils/UIKitUtils.h index c743a7bf94..607d748fad 100644 --- a/submodules/UIKitRuntimeUtils/Source/UIKitRuntimeUtils/UIKitUtils.h +++ b/submodules/UIKitRuntimeUtils/Source/UIKitRuntimeUtils/UIKitUtils.h @@ -24,3 +24,5 @@ void applySmoothRoundedCornersImpl(CALayer * _Nonnull layer); @end UIView * _Nullable makePortalView(bool matchPosition); + +NSObject * _Nullable makeBlurFilter(); diff --git a/submodules/UIKitRuntimeUtils/Source/UIKitRuntimeUtils/UIKitUtils.m b/submodules/UIKitRuntimeUtils/Source/UIKitRuntimeUtils/UIKitUtils.m index bba1cd4bda..ecea0b1e92 100644 --- a/submodules/UIKitRuntimeUtils/Source/UIKitRuntimeUtils/UIKitUtils.m +++ b/submodules/UIKitRuntimeUtils/Source/UIKitRuntimeUtils/UIKitUtils.m @@ -200,3 +200,13 @@ UIView * _Nullable makePortalView(bool matchPosition) { return nil; } } + +@protocol GraphicsFilterProtocol + +- (NSObject * _Nullable)filterWithName:(NSString * _Nonnull)name; + +@end + +NSObject * _Nullable makeBlurFilter() { + return [(id)NSClassFromString(@"CAFilter") filterWithName:@"gaussianBlur"]; +}