Реалізація Tooltip-підсказок для нових функцій в мобільному додатку
Після крупного оновлення користувачі не помічають нову кнопку в тулбарі. Не тому що вона погано спроектована, а тому що ніхто не показав, що вона з'явилась. Tooltip вирішує це точково — без онбординга, без модальних вікон.
Технична реалізація
На iOS з SwiftUI — модифікатор .popover(isPresented:) для простих випадків або кастомний ViewModifier з ZStack + GeometryReader для позиціонування bubble відносно target-елемента. Системний UIToolTip з'явився лише в iOS 15 та працює виключно з pointer (iPad + Apple Pencil / trackpad), для смартфонів не підходить. Тому tooltip робиться через overlay з anchorPreference для обчислення координат target'а у глобальному просторі.
У UIKit — UIView bubble з CAShapeLayer для стрілки, позиціонується через convert(_:to:) та window?.addSubview(). Ключовий момент: додавати у window, а не у superview — інакше bubble обрізатиметься при clipsToBounds батьківського контейнера.
На Android з Compose — Popup + кастомна composable з вимірюванням через onGloballyPositioned. Material3 не має вбудованого tooltip з довільним позиціюванням; PlainTooltip та RichTooltip з'явилися в Material3 1.1.0, але працюють лише з TooltipBox та обмежені в кастомізації. Для повного контролю — власна реалізація через Popup з alignment = Alignment.TopStart та смішенням на основі координат target.
У React Native — бібліотека react-native-walkthrough-tooltip або кастомний Modal з measure() для обчислення позиції. Modal з transparent={true} та animationType="fade" дає потрібний ефект.
Управління станом показу
Tooltip показується один раз при першому виявленні функції. Логіка: при кожному запуску додатку перевіряємо UserDefaults / SharedPreferences на ключ tooltip_feature_X_shown. Показуємо — записуємо флаг. Повторний показ — лише по явному триггеру (наприклад, «Що нового?»).
Для кількох одночасних фич — черга: tooltipQueue: [TooltipConfig], показуємо по одному з задержкою 300–500 мс між показами. Не показуємо під час активної анімації або переходу між екранами — відстежуємо стан навігації.
Задержка перед показом 500–800 мс після завантаження екрана обов'язкова. Tooltip поверх ще не дорисованого контента виглядає як баг.
Доступність
accessibilityLabel на dismiss-кнопці. VoiceOver повинен зачитувати текст підсказки автоматично при появі через UIAccessibility.post(notification: .announcement, argument: tooltipText). TalkBack — AccessibilityEvent.TYPE_ANNOUNCEMENT через View.announceForAccessibility().
Терміни: 1–3 дні в залежності від кількості підсказок, складності позиціонування та необхідності підтримки кількох платформ.







