UISlider изнутри: почему `setValue` не работает во время settle-анимации и как я это обошел
vientooscuro 12 минут назад UISlider изнутри: почему `setValue` не работает во время settle-анимации и как я это обошел Сложный 11 мин 289 Swift * Objective C * Разработка мобильных приложений * Кейс В iOS 26 у UISlider...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
В сфере искусственного интеллекта произошло заметное событие. vientooscuro 12 минут назад UISlider изнутри: почему `setValue` не работает во время settle-анимации и как я это обошел Сложный 11 мин 289 Swift * Objective C * Разработка мобильных приложений * Кейс В iOS 26 у UISlider появился liquid-glass-вид и физика доводки (settle) после того, как пользователь отпускает палец. Если честно, я не проверял, как это выглядело в старых версиях и как оно работало, так как до iOS 26 ни в своих проектах, ни в тех, что я писал на работе, я не использовал стандартный компонент, так как его внешний вид никого не устраивал. У такой доводки есть побочный эффект: если в этот момент дернуть setValue(_:animated:) извне, наш слайдер на один кадр едет в новую точку, а потом откатывается туда, куда его тянет settle.
removeAllAnimations() не помогает: анимация идёт не через CABasicAnimation, а через property-driver на display link. Дальше про то, как я нашёл рабочий путь это исправить. Самое неприятное в этом баге было не само дёрганье, а ощущение, что публичный API говорит "значение поставлено”, а визуальный слой через кадр отвечает “нет, я лучше вернусь куда хотел”.
Технические детали
Поэтому я отдельно разделю два пути: runtime-фикс для понимания механики и продовый обход (хотя в личном приложении я пошел бы в прод с фиксом). СимптомУ меня есть кастомный слайдер интенсивности в редакторе. Внешний код иногда зовёт у него setValue, причём ровно в тот момент, когда пользователь только что отпустил палец: например пришло новое значение из другого места UI и его надо отразить на ползунке.
На iOS 18 и ниже это работало без вопросов просто по той причине, что использовался кастомный слайдер. но на iOS 26 мы перешли на использование стандартного слайдера. Вообще, изначально я из-за некоторых особенностей стандартного слайдера и уже наличия кастомного пытался реализовать thumb отдельно поверх кастомного, что даже работало, но не совсем так, как хотелось бы (опять же, с помощью создания приватного в iOS 26 класса линзы, которую довольно непросто было дорабатывать до желаемого состояния).
В итоге я всё же решил использовать нативный слайдер, в том числе, потому что в нашем приложении один из критериев, брать что-либо или нет в улучшение, – как сделано у конкурента, котоорый достаточно хорошо работает. В итоге проблема – я ставлю значение в 0, а ползунок едет в 0 на один кадр и тут же откатывается обратно к той точке, куда его несло после отпускания пальца. Первая версия была банальная: остаточная анимация на слое.
Отраслевые последствия
setValue(0, animated: false) slider. removeAllAnimations() Не помогло вообще. Ползунок откатывается так же.
Вот это и была первая зацепка: если removeAllAnimations() молчит, значит доводку крутит не CABasicAnimation. Что-то другое читает старый target на каждом кадре и тянет thumb обратно. Сначала я попробовал тупое и быстроеПрежде чем лезть в runtime, я честно отработал два простых варианта.
Оба чинили симптом частично. Первый вариант: отложить внешний setValue на время анимации.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





