Swift PhaseAnimator сохраняет циклIOS

Программируем под IOS
Ответить
Гость
 Swift PhaseAnimator сохраняет цикл

Сообщение Гость »


Я пытаюсь использовать новый PhaseAnimator из iOS 17 и заметил ошибку. По какой-то причине анимация не освобождается при удалении представления из иерархии, что приводит к сбою приложения.

Пример

enum OuterBreathState: CaseIterable { корпус выдох, вдох масштаб переменной: CGFloat { переключить себя { случай .inhale: вернуть 2 случай .exhale: вернуть 1 } } вар цвет: Цвет { переключить себя { корпус .вдох: возврат .белый случай .выдох: возврат .синий } } } структура PhaseView: Просмотр { var body: some View { PhaseAnimator(OuterBreathState.allCases) { состояние в Круг() .фон(.очистить) .frame(ширина: 150, высота: 150) .padding(.вертикальный) .scaleEffect(state.scale) .background(в: Круг()) .foregroundStyle(state.color) } анимация: {состояние в состояние переключения { case .inhale: return .easeInOut(длительность: 1,5) case .exhale: return .easeInOut(длительность: 3,5) } } } } структура ContentView: Просмотр { var body: some View { Навигационный стек { NavigationLink("push") { ФазовыйПросмотр() } } } } Нажатие на представление работает нормально, но после открытия приложение перестает отвечать 😓 На самом деле происходит сбой обновления контента. Если я не делаю обновлений в Круге, все работает нормально. Я также попробовал использовать завершающую функцию phaseAnimator, у меня такое же поведение.`

Как ни странно, если я использую триггер (и даже таймер, который переключает триггер, чтобы имитировать цикл), он не дает сбоя. Вот код

перечисление OuterBreathState: CaseIterable { корпус выдох, вдох масштаб переменной: CGFloat { переключить себя { случай .inhale: вернуть 2 случай .exhale: вернуть 1 } } вар цвет: Цвет { переключить себя { корпус .вдох: возврат .белый случай .выдох: возврат .синий } } } структура PhaseView: Просмотр { @State var animate = false let timer = Timer.publish(каждый: 5, допуск: .ноль, on: .main, in: .default).autoconnect() var body: some View { PhaseAnimator(OuterBreathState.allCases, триггер: animate) {состояние в Круг() .фон(.очистить) .frame(ширина: 150, высота: 150) .padding(.вертикальный) .scaleEffect(state.scale) .background(в: Круг()) .foregroundStyle(state.color) } анимация: {состояние в состояние переключения { case .inhale: return .easeInOut(длительность: 1,5) case .exhale: return .easeInOut(длительность: 3,5) } } .onReceive(таймер, выполнение: { _ в анимировать.toggle() }) .onTapGesture { анимировать.toggle() } } } структура ContentView: Просмотр { var body: some View { Навигационный стек { NavigationLink("push") { ФазовыйПросмотр() } } } } #Предварительный просмотр { КонтентПросмотр() } Есть идеи, почему происходит сбой и как заставить это работать? Спасибо!
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»