SwiftUI에서 객체 변경이 관찰 될 때 목록에서 애니메이션을 비활성화하는 방법은 무엇입니까?


15

뷰 모델 데이터 변경시 애니메이션을 비활성화하려면 어떻게합니까?

다음 코드가 있습니다.

struct FormView: View {

    @ObservedObject var viewModel: FormViewModel

    var body: some View {
        List {
            ForEach(viewModel.options) { option in
                Text(option.displayValue)
            }
        }
    }
}

뷰 모델 변경 사항 List이 애니메이션으로 업데이트 될 때마다
어떻게 비활성화합니까?
추가를 시도 .animation(nil)했지만 도움이되지 않습니다.

답변:


1

Apple이 List에서 변경을 할 때까지 해결 방법은 List.id (_ :)입니다. List의 내부 상태를 변경하고 애니메이션없이 List를 즉시 다시 만들도록합니다. 자세한 내용은 애니메이션 재 장전 목록 재로드 를 참조하십시오.

모든 View에서 동일한 작업을 수행 할 수 있지만 (func id ()는 View 프로토콜의 일부 임) 모든 상태 변수가 초기 "기본"상태를 가지므로주의해서 사용해야합니다. 뷰를 "다시 작성"하는 것과 같습니다.

작동 방식을 이해하려면 https://swiftui-lab.com/swiftui-id/를 참조 하십시오.


1

내가 찾은 해결책은 매번 변경되는 고유 식별자를 추가하여 애니메이션없이 매번 목록을 다시 작성하는 것입니다. iOS 13.4에서 확인되었습니다.

var body: some View {
    List {
        ForEach(viewModel.options) { option in
            Text(option.displayValue)
        }
    }
    .id(UUID()) // no animation
}

-3
  1. 를 사용하지 않는 경우 List 내부에서 ForEach를 사용할 필요가 없습니다 Section. 따라서 대신 :

    List {
        ForEach(viewModel.options) { option in
            Text(option.displayValue)
        })
    }

    다음 코드는 작성하기에 충분합니다.

    List(viewModel.options) { option in
        Text(option.displayValue)
    }

    또한 ForEach를 사용하면 몇 가지 문제가 발생할 수 있습니다. 예 : SwiftUI : ForEach + ContextMenu를 사용할 수 있습니까?

  2. + ForEach()만 사용 하거나 List()+ 만 사용하는 경우 .animation(nil)문제를 해결해야합니다.

    샘플 1 :

    ForEach(viewModel.options) { option in
        Text(option.displayValue)
    }.animation(nil)

    샘플 2 :

    List(viewModel.options) { option in
        Text(option.displayValue)
    }.animation(nil)

    macOS 10.15.2 (19C57)에서 모두 테스트되었으며 완벽하게 작동합니다.

  3. 또한 당신은 사용을 시도 할 수 있습니다 .animation(nil)에 List와 ForEach모두. 나는 시도하지 않았다. 그러나 나는 이것이 또한 당신에게 필요한 효과를 줄 것이라고 생각한다.

    List {
        ForEach(viewModel.options) { option in
            Text(option.displayValue)
        }.animation(nil)
    }.animation(nil)

.animation(nil)불행하게도, 13.3에 아무런 영향이없는 것으로 보인다
— 파비안 Streitel에게

@ FabianStreitel macOS 10.15.2 (19C57)에서 2 부를 테스트했으며 완벽하게 작동합니다.
— Andrew

그리고 iOS 13.3에서 세 가지 변형을 모두 테스트했으며 (위의 설명에 언급 된 바와 같이) 목록 동작을 전혀 변경하지 않습니다. 안타깝게도 OP는 iOS 또는 macOS 앱을 만들고 있는지 여부를 밝히지 않았습니다. 그러나 iOS에서 작동하지 않는 정보는 다른 사람들과도 관련이 있다고 생각합니다.
— Fabian Streitel

최근 .animation(nil)iOS 13.4에서 Xcode 11.4를 사용하여 테스트 했으며 나에게 적합합니다.
— Simen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.