From c9b76c92943dd5264a7946c8ea68bb4a1898c2cb Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Sun, 19 Apr 2026 14:17:48 +0200 Subject: [PATCH] Various fixes --- submodules/Display/Source/NavigationBar.swift | 1 + .../Sources/NavigationBarImpl.swift | 13 ++-- .../Sources/ChatbotSetupScreen.swift | 71 +++++++++++------- .../AddMusic.imageset/Contents.json | 12 +++ .../AddMusic.imageset/addmusic.pdf | Bin 0 -> 6236 bytes .../CreateGroup.imageset/Contents.json | 12 +++ .../CreateGroup.imageset/sharenewgroup.pdf | Bin 0 -> 6802 bytes 7 files changed, 78 insertions(+), 31 deletions(-) create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Context Menu/AddMusic.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chat/Context Menu/AddMusic.imageset/addmusic.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Navigation/CreateGroup.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Navigation/CreateGroup.imageset/sharenewgroup.pdf diff --git a/submodules/Display/Source/NavigationBar.swift b/submodules/Display/Source/NavigationBar.swift index bdac308c32..00d2a9c12b 100644 --- a/submodules/Display/Source/NavigationBar.swift +++ b/submodules/Display/Source/NavigationBar.swift @@ -179,6 +179,7 @@ public protocol NavigationBar: ASDisplayNode { var leftButtonNode: NavigationButtonNode { get } var rightButtonNode: NavigationButtonNode { get } var additionalContentNode: SparseNode { get } + var edgeEffectView: UIView? { get } func reattachAdditionalContentNode() diff --git a/submodules/TelegramUI/Components/NavigationBarImpl/Sources/NavigationBarImpl.swift b/submodules/TelegramUI/Components/NavigationBarImpl/Sources/NavigationBarImpl.swift index f06aa9ef82..f66d46fa98 100644 --- a/submodules/TelegramUI/Components/NavigationBarImpl/Sources/NavigationBarImpl.swift +++ b/submodules/TelegramUI/Components/NavigationBarImpl/Sources/NavigationBarImpl.swift @@ -583,11 +583,14 @@ public final class NavigationBarImpl: ASDisplayNode, NavigationBar { public var secondaryContentHeight: CGFloat private var edgeEffectExtension: CGFloat = 0.0 - private var edgeEffectView: EdgeEffectView? + private var edgeEffectViewImpl: EdgeEffectView? + public var edgeEffectView: UIView? { + return self.edgeEffectViewImpl + } private var backgroundContainer: GlassBackgroundContainerView? public var backgroundView: UIView { - if let edgeEffectView = self.edgeEffectView { + if let edgeEffectView = self.edgeEffectViewImpl { return edgeEffectView } else { return self.backgroundNode.view @@ -654,7 +657,7 @@ public final class NavigationBarImpl: ASDisplayNode, NavigationBar { if case .glass = presentationData.theme.style { let edgeEffectView = EdgeEffectView() edgeEffectView.isUserInteractionEnabled = false - self.edgeEffectView = edgeEffectView + self.edgeEffectViewImpl = edgeEffectView self.view.addSubview(edgeEffectView) let backgroundContainer = GlassBackgroundContainerView() @@ -818,7 +821,7 @@ public final class NavigationBarImpl: ASDisplayNode, NavigationBar { backgroundContainer.update(size: backgroundContainerFrame.size, isDark: self.presentationData.theme.overallDarkAppearance, transition: ComponentTransition(transition)) } - if let edgeEffectView = self.edgeEffectView { + if let edgeEffectView = self.edgeEffectViewImpl { if let edgeEffectColor = self.presentationData.theme.edgeEffectColor, edgeEffectColor.alpha == 0.0 { edgeEffectView.isHidden = true } else { @@ -1131,7 +1134,7 @@ public final class NavigationBarImpl: ASDisplayNode, NavigationBar { } private func applyEdgeEffectExtension(transition: ContainedViewLayoutTransition) { - if let edgeEffectView = self.edgeEffectView { + if let edgeEffectView = self.edgeEffectViewImpl { transition.updateTransform(layer: edgeEffectView.layer, transform: CATransform3DMakeTranslation(0.0, max(0.0, min(20.0, self.edgeEffectExtension)), 0.0)) } } diff --git a/submodules/TelegramUI/Components/Settings/ChatbotSetupScreen/Sources/ChatbotSetupScreen.swift b/submodules/TelegramUI/Components/Settings/ChatbotSetupScreen/Sources/ChatbotSetupScreen.swift index f507350f5a..c936e8cdec 100644 --- a/submodules/TelegramUI/Components/Settings/ChatbotSetupScreen/Sources/ChatbotSetupScreen.swift +++ b/submodules/TelegramUI/Components/Settings/ChatbotSetupScreen/Sources/ChatbotSetupScreen.swift @@ -15,6 +15,7 @@ import ViewControllerComponent import MultilineTextComponent import BalancedTextComponent import BackButtonComponent +import EdgeEffect import ListSectionComponent import ListActionItemComponent import ListTextFieldItemComponent @@ -144,6 +145,7 @@ final class ChatbotSetupScreenComponent: Component { private let scrollView: ScrollView private let navigationTitle = ComponentView() + private let titleTransformContainer: UIView private let icon = ComponentView() private let subtitle = ComponentView() private let nameSection = ComponentView() @@ -190,6 +192,9 @@ final class ChatbotSetupScreenComponent: Component { } self.scrollView.alwaysBounceVertical = true + self.titleTransformContainer = UIView() + self.titleTransformContainer.isUserInteractionEnabled = false + super.init(frame: frame) self.scrollView.delegate = self @@ -203,6 +208,7 @@ final class ChatbotSetupScreenComponent: Component { } deinit { + self.titleTransformContainer.removeFromSuperview() } func scrollToTop() { @@ -251,33 +257,29 @@ final class ChatbotSetupScreenComponent: Component { self.updateScrolling(transition: .immediate) } - var scrolledUp = true private func updateScrolling(transition: ComponentTransition) { - let navigationRevealOffsetY: CGFloat = 0.0 - - let navigationAlphaDistance: CGFloat = 16.0 - let navigationAlpha: CGFloat = max(0.0, min(1.0, (self.scrollView.contentOffset.y - navigationRevealOffsetY) / navigationAlphaDistance)) - if let controller = self.environment?.controller(), let navigationBar = controller.navigationBar { - transition.setAlpha(layer: navigationBar.backgroundNode.layer, alpha: navigationAlpha) - transition.setAlpha(layer: navigationBar.stripeNode.layer, alpha: navigationAlpha) + guard let environment = self.environment else { + return } - var scrolledUp = false - if navigationAlpha < 0.5 { - scrolledUp = true - } else if navigationAlpha > 0.5 { - scrolledUp = false - } + let titleCenterY: CGFloat = environment.statusBarHeight + (environment.navigationHeight - environment.statusBarHeight) * 0.5 + let titleTransformDistance: CGFloat = 20.0 + let titleY: CGFloat = max(titleCenterY, self.titleTransformContainer.center.y - self.scrollView.contentOffset.y) - if self.scrolledUp != scrolledUp { - self.scrolledUp = scrolledUp - if !self.isUpdating { - self.state?.updated() - } - } + transition.setSublayerTransform(view: self.titleTransformContainer, transform: CATransform3DMakeTranslation(0.0, titleY - self.titleTransformContainer.center.y, 0.0)) + let titleYDistance: CGFloat = titleY - titleCenterY + let titleTransformFraction: CGFloat = 1.0 - max(0.0, min(1.0, titleYDistance / titleTransformDistance)) + let titleMinScale: CGFloat = 17.0 / 24.0 + let titleScale: CGFloat = 1.0 * (1.0 - titleTransformFraction) + titleMinScale * titleTransformFraction if let navigationTitleView = self.navigationTitle.view { - transition.setAlpha(view: navigationTitleView, alpha: 1.0) + transition.setScale(view: navigationTitleView, scale: titleScale) + } + + if let controller = environment.controller(), let navigationBar = controller.navigationBar, let edgeEffectView = navigationBar.edgeEffectView { + let edgeEffectAlphaDistance = max(1.0, self.titleTransformContainer.center.y - titleCenterY) + let edgeEffectAlpha = max(0.0, min(1.0, self.scrollView.contentOffset.y / edgeEffectAlphaDistance)) + transition.setAlpha(view: edgeEffectView, alpha: edgeEffectAlpha) } } @@ -652,13 +654,30 @@ final class ChatbotSetupScreenComponent: Component { containerSize: CGSize(width: availableSize.width, height: 100.0) ) let navigationTitleFrame = CGRect(origin: CGPoint(x: floor((availableSize.width - navigationTitleSize.width) / 2.0), y: environment.navigationHeight + 76.0), size: navigationTitleSize) - if let navigationTitleView = self.navigationTitle.view { - if navigationTitleView.superview == nil { - if let controller = self.environment?.controller(), let navigationBar = controller.navigationBar { - navigationBar.view.addSubview(navigationTitleView) + let overlaySuperview: UIView? + if let controller = environment.controller(), let navigationBar = controller.navigationBar, let navigationBarSuperview = navigationBar.view.superview { + overlaySuperview = navigationBarSuperview + } else { + overlaySuperview = self + } + if let overlaySuperview { + if self.titleTransformContainer.superview !== overlaySuperview { + self.titleTransformContainer.removeFromSuperview() + if let controller = environment.controller(), let navigationBar = controller.navigationBar, overlaySuperview === navigationBar.view.superview { + overlaySuperview.insertSubview(self.titleTransformContainer, aboveSubview: navigationBar.view) + } else { + overlaySuperview.addSubview(self.titleTransformContainer) } } - transition.setFrame(view: navigationTitleView, frame: navigationTitleFrame) + } + if let navigationTitleView = self.navigationTitle.view { + if navigationTitleView.superview !== self.titleTransformContainer { + navigationTitleView.removeFromSuperview() + self.titleTransformContainer.addSubview(navigationTitleView) + } + transition.setPosition(view: self.titleTransformContainer, position: navigationTitleFrame.center) + transition.setBounds(view: self.titleTransformContainer, bounds: CGRect(origin: CGPoint(), size: navigationTitleFrame.size)) + transition.setFrame(view: navigationTitleView, frame: CGRect(origin: CGPoint(), size: navigationTitleFrame.size)) } let bottomContentInset: CGFloat = 24.0 diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/AddMusic.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/AddMusic.imageset/Contents.json new file mode 100644 index 0000000000..fb844031d6 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/AddMusic.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "addmusic.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/AddMusic.imageset/addmusic.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/AddMusic.imageset/addmusic.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6939e1fdab56feb8c239f24b7464f525eef4d89c GIT binary patch literal 6236 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 E00!38^Z)<= literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Navigation/CreateGroup.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Navigation/CreateGroup.imageset/Contents.json new file mode 100644 index 0000000000..e30ddbbd0e --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Navigation/CreateGroup.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "sharenewgroup.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/Navigation/CreateGroup.imageset/sharenewgroup.pdf b/submodules/TelegramUI/Images.xcassets/Navigation/CreateGroup.imageset/sharenewgroup.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6f8900ccefd73e4fae32db2faf12acf9ce508a86 GIT binary patch literal 6802 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 literal 0 HcmV?d00001