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)ListForEach모두. 나는 시도하지 않았다. 그러나 나는 이것이 또한 당신에게 필요한 효과를 줄 것이라고 생각한다.

    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.