diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift index ba79a78216..c22f9e329b 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift @@ -365,6 +365,7 @@ public final class StoryItemSetContainerComponent: Component { var preparingToDisplayViewList: Bool = false var displayViewList: Bool = false var viewLists: [Int32: ViewList] = [:] + let viewListsContainer: UIView var isEditingStory: Bool = false @@ -440,6 +441,9 @@ public final class StoryItemSetContainerComponent: Component { self.inputPanelContainer.isUserInteractionEnabled = false self.inputPanelContainer.layer.cornerRadius = 11.0 + self.viewListsContainer = SparseContainerView() + self.viewListsContainer.clipsToBounds = true + super.init(frame: frame) self.itemsContainerView.addSubview(self.scroller) @@ -457,6 +461,8 @@ public final class StoryItemSetContainerComponent: Component { self.controlsContainerView.addSubview(self.closeButton) self.closeButton.addTarget(self, action: #selector(self.closePressed), for: .touchUpInside) + self.addSubview(self.viewListsContainer) + let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.tapGesture(_:))) tapRecognizer.delegate = self self.itemsContainerView.addGestureRecognizer(tapRecognizer) @@ -981,7 +987,9 @@ public final class StoryItemSetContainerComponent: Component { let combinedFraction = offsetFraction + centerFraction let combinedFractionSign: CGFloat = combinedFraction < 0.0 ? -1.0 : 1.0 - let fractionDistanceToCenter: CGFloat = min(1.0, abs(combinedFraction)) + let unboundFractionDistanceToCenter: CGFloat = abs(combinedFraction) + let fractionDistanceToCenter: CGFloat = min(1.0, unboundFractionDistanceToCenter) + let _ = fractionDistanceToCenter var itemPositionX = centralItemX itemPositionX += min(1.0, abs(combinedFraction)) * combinedFractionSign * scaledFullItemScrollDistance @@ -1120,7 +1128,15 @@ public final class StoryItemSetContainerComponent: Component { } itemTransition.setTransform(view: visibleItem.contentContainerView, transform: transform) itemTransition.setCornerRadius(layer: visibleItem.contentContainerView.layer, cornerRadius: 12.0 * (1.0 / itemScale)) - itemTransition.setAlpha(view: visibleItem.contentContainerView, alpha: 1.0 * (1.0 - fractionDistanceToCenter) + 0.75 * fractionDistanceToCenter) + + let countedFractionDistanceToCenter: CGFloat = max(0.0, min(1.0, unboundFractionDistanceToCenter / 3.0)) + var itemAlpha: CGFloat = 1.0 * (1.0 - countedFractionDistanceToCenter) + 0.0 * countedFractionDistanceToCenter + itemAlpha = max(0.0, min(1.0, itemAlpha)) + + let collapsedAlpha = itemAlpha * itemLayout.contentScaleFraction + 0.0 * (1.0 - itemLayout.contentScaleFraction) + itemAlpha = (1.0 - fractionDistanceToCenter) * itemAlpha + fractionDistanceToCenter * collapsedAlpha + + itemTransition.setAlpha(view: visibleItem.contentContainerView, alpha: itemAlpha) var itemProgressMode = self.itemProgressMode() if index != centralIndex { @@ -2137,12 +2153,12 @@ public final class StoryItemSetContainerComponent: Component { var viewListFrame = CGRect(origin: CGPoint(x: viewListBaseOffsetX, y: availableSize.height - viewListSize.height), size: viewListSize) let indexDistance = CGFloat(max(-1, min(1, itemIndex - currentIndex))) - viewListFrame.origin.x += indexDistance * availableSize.width + viewListFrame.origin.x += indexDistance * (availableSize.width + 20.0) if let viewListView = viewList.view.view as? StoryItemSetViewListComponent.View { var animateIn = false if viewListView.superview == nil { - self.addSubview(viewListView) + self.viewListsContainer.addSubview(viewListView) animateIn = true } else { fixedAnimationOffset = viewListFrame.minX - viewListView.frame.minX @@ -2227,6 +2243,15 @@ public final class StoryItemSetContainerComponent: Component { let contentFrame = CGRect(origin: CGPoint(x: 0.0, y: component.containerInsets.top - (contentSize.height - contentVisualHeight) * 0.5), size: contentSize) + transition.setFrame(view: self.viewListsContainer, frame: CGRect(origin: CGPoint(x: contentFrame.minX, y: 0.0), size: CGSize(width: contentSize.width, height: availableSize.height))) + let viewListsRadius: CGFloat + if component.metrics.widthClass == .regular { + viewListsRadius = 10.0 + } else { + viewListsRadius = 0.0 + } + transition.setCornerRadius(layer: self.viewListsContainer.layer, cornerRadius: viewListsRadius) + transition.setFrame(view: self.inputPanelContainer, frame: contentFrame) let itemLayout = ItemLayout( diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetViewListComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetViewListComponent.swift index cdd27c0cdd..606a5a949f 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetViewListComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetViewListComponent.swift @@ -586,10 +586,11 @@ final class StoryItemSetViewListComponent: Component { } if itemUpdated || viewsNilUpdated { - self.viewListState = nil self.viewListDisposable?.dispose() if let views = component.storyItem.views { + self.viewListState = nil + let viewList: EngineStoryViewListContext if let current = component.sharedListsContext.viewLists[StoryId(peerId: component.peerId, id: component.storyItem.id)] { viewList = current @@ -618,6 +619,8 @@ final class StoryItemSetViewListComponent: Component { }) applyState = true let _ = synchronous + } else { + self.viewListState = EngineStoryViewListContext.State(totalCount: 0, items: [], loadMoreToken: nil) } }