From 44f8d4e2734d7512212b670fd0eed62cb0ab1301 Mon Sep 17 00:00:00 2001 From: booster Date: Wed, 25 Mar 2026 16:40:06 +0300 Subject: [PATCH] TooltipHostView protocol implemented commit_hash:7738aeb8a1c7e41a279d409009fc4b663e3204cf --- .mapping.json | 1 + .../LayoutKit/Tooltips/TooltipHostView.swift | 14 ++++++++++++++ .../LayoutKit/Tooltips/TooltipManager.swift | 2 +- .../LayoutKit/Tooltips/ViewTooltipPresenter.swift | 10 +++++----- 4 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 client/ios/LayoutKit/LayoutKit/Tooltips/TooltipHostView.swift diff --git a/.mapping.json b/.mapping.json index 67abe9a60..1789058b1 100644 --- a/.mapping.json +++ b/.mapping.json @@ -19140,6 +19140,7 @@ "client/ios/LayoutKit/LayoutKit/GenericViewBlock.swift":"divkit/public/client/ios/LayoutKit/LayoutKit/GenericViewBlock.swift", "client/ios/LayoutKit/LayoutKit/Tooltips/TooltipAnchorView.swift":"divkit/public/client/ios/LayoutKit/LayoutKit/Tooltips/TooltipAnchorView.swift", "client/ios/LayoutKit/LayoutKit/Tooltips/TooltipFactory.swift":"divkit/public/client/ios/LayoutKit/LayoutKit/Tooltips/TooltipFactory.swift", + "client/ios/LayoutKit/LayoutKit/Tooltips/TooltipHostView.swift":"divkit/public/client/ios/LayoutKit/LayoutKit/Tooltips/TooltipHostView.swift", "client/ios/LayoutKit/LayoutKit/Tooltips/TooltipManager.swift":"divkit/public/client/ios/LayoutKit/LayoutKit/Tooltips/TooltipManager.swift", "client/ios/LayoutKit/LayoutKit/Tooltips/TooltipPresenter.swift":"divkit/public/client/ios/LayoutKit/LayoutKit/Tooltips/TooltipPresenter.swift", "client/ios/LayoutKit/LayoutKit/Tooltips/ViewTooltipPresenter.swift":"divkit/public/client/ios/LayoutKit/LayoutKit/Tooltips/ViewTooltipPresenter.swift", diff --git a/client/ios/LayoutKit/LayoutKit/Tooltips/TooltipHostView.swift b/client/ios/LayoutKit/LayoutKit/Tooltips/TooltipHostView.swift new file mode 100644 index 000000000..fe5b038ec --- /dev/null +++ b/client/ios/LayoutKit/LayoutKit/Tooltips/TooltipHostView.swift @@ -0,0 +1,14 @@ +import Foundation + +/// A view that can host tooltip display, serving as an alternative to the window-based approach. +/// +/// Conforming to this protocol allows a view to act as a +/// container for tooltip presentation. When set on `DefaultTooltipManager`, tooltips will be +/// displayed within the host view's hierarchy instead of a separate `UIWindow`. +public protocol TooltipHostView: ViewType { + /// The bounds available for tooltip positioning, typically inset by safe area. + var tooltipContainerBounds: CGRect { get } + + /// Adds a tooltip view to the host's view hierarchy. + func addTooltipView(_ view: ViewType) +} diff --git a/client/ios/LayoutKit/LayoutKit/Tooltips/TooltipManager.swift b/client/ios/LayoutKit/LayoutKit/Tooltips/TooltipManager.swift index e6c21089f..1c7f08f9b 100644 --- a/client/ios/LayoutKit/LayoutKit/Tooltips/TooltipManager.swift +++ b/client/ios/LayoutKit/LayoutKit/Tooltips/TooltipManager.swift @@ -93,7 +93,7 @@ public class DefaultTooltipManager: TooltipManager { public init( shownTooltips: Property> = Property(), handleAction: @escaping (UIActionEvent) -> Void = { _ in }, - externalView: UIView? = nil + externalView: TooltipHostView? = nil ) { self.presenter = externalView.map { ViewTooltipPresenter(containerView: $0) } ?? WindowTooltipPresenter() diff --git a/client/ios/LayoutKit/LayoutKit/Tooltips/ViewTooltipPresenter.swift b/client/ios/LayoutKit/LayoutKit/Tooltips/ViewTooltipPresenter.swift index 5744a710b..6260a09da 100644 --- a/client/ios/LayoutKit/LayoutKit/Tooltips/ViewTooltipPresenter.swift +++ b/client/ios/LayoutKit/LayoutKit/Tooltips/ViewTooltipPresenter.swift @@ -3,19 +3,19 @@ import UIKit import VGSL final class ViewTooltipPresenter: TooltipPresenter { - private let containerView: UIView + private let containerView: TooltipHostView - init(containerView: UIView) { + init(containerView: TooltipHostView) { self.containerView = containerView } func prepare() -> (constraint: CGRect, coordinateSpace: UIView?)? { - (containerView.bounds, containerView) + (containerView.tooltipContainerBounds, containerView) } func present(_ view: TooltipContainerView, for tooltip: DefaultTooltipManager.Tooltip) { - containerView.addSubview(view) - view.frame = containerView.bounds + containerView.addTooltipView(view) + view.frame = containerView.tooltipContainerBounds if tooltip.params.mode == .modal { view.accessibilityViewIsModal = true }