Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- RaceCondition
- cleanarchitecture
- MainScheduler
- 등굣길
- DiffableDataSource
- combine
- leetcode
- GIT
- 코테
- MainScheduler.asyncInstance
- SwiftUI
- gitflow
- MethodSwilzzling
- DependencyInjection
- GCD
- SeSAC
- SRP
- MainScheduler.Instance
- data_structure
- 청년취업사관학교
- 프로그래머스
- 오픈채팅방
- DynamicMemberLookup
- Realm
- IOS
- 명품cppProgramming c++
- swift
- DispatchQueue
- CoreBluetooth
- rxswift
Archives
- Today
- Total
Do.
SwiftUI - 애니메이션 사라질 때 동작하지 않는 경우(SwiftUI Disappear transition not animated) 본문
iOS
SwiftUI - 애니메이션 사라질 때 동작하지 않는 경우(SwiftUI Disappear transition not animated)
Hey_Hen 2022. 5. 10. 23:29문제
SwiftUI는 withAnimation으로 간단하게 애니메이션을 할 수 있는데, 종종 사라질 때 이 애니메이션이 작용하지 않는 듯한 모습을 보입니다.
Tap을 하면 Circle은 자연스럽게 opacity Transition이 동작하는데, 글자는 나타날 때는 애니메이션이 잘 되는거 같은데, 사라질 때는 애니메이션이 동작하지 않는 것 처럼 뿅하고 사라집니다.
더보기
struct ContentView: View {
@State var state: Bool = false
var body: some View {
VStack {
Button {
withAnimation {
state.toggle()
}
} label: {
Text("Tap \(state ? "On" : "Off")")
}
ZStack {
Circle()
.foregroundColor(state ? .blue : .clear)
if state {
Text("Hello Swift")
.foregroundColor(state ? .white : .black)
.font(.system(size: 55))
.transition(.opacity.animation(.easeIn(duration: 1).delay(0.5)))
}
}
}
}
}
애니메이션이 되지 않는 것일까요?
아래 백그라운드에 Rectable을 검게 반만 깔아보았습니다. 검은 배경이 있는 곳은 애니메이션이 정상적으로 보이는데
하얀 배경쪽에서는 바로 사라지는 것 처럼 보입니다.
원인
원인은 ZIndex로 Text가 Transition 될 때 ZIndex가 원 보다 아래로 내려가면서 한번에 사라지는 것 처럼 보입니다. 아마 이는 명백한 버그 일 것입니다..
해결
해결법은 간단한데, Text가 Transition 될 때 강제로 ZIndex가 0이 되는 것이 문제이므로, ZIndex를 명시적으로 1로 정하거나 원의 ZIndex를 0보다 낮은 -1 등으로 정하면 해결 할 수 있습니다.
struct ContentView: View {
@State var state: Bool = false
var body: some View {
VStack {
Button {
withAnimation {
state.toggle()
}
} label: {
Text("Tap \(state ? "On" : "Off")")
}
ZStack {
Circle()
.foregroundColor(state ? .blue : .clear)
if state {
Text("Hello Swift")
.foregroundColor(state ? .white : .black)
.font(.system(size: 55))
.zIndex(1)
}
}
.background(Rectangle().foregroundColor(.black).frame(width: UIScreen.main.bounds.width / 2), alignment: .leading)
}
}
}
참고
https://sarunw.com/posts/how-to-fix-zstack-transition-animation-in-swiftui/
https://stackoverflow.com/questions/57730074/transition-animation-not-working-in-swiftui
'iOS' 카테고리의 다른 글
Swift - Dynamic member lookup (0) | 2022.05.18 |
---|---|
Combine - 여러 요청 결과를 결합해야 하는 경우 (0) | 2022.05.17 |
iOS - URLCache (0) | 2022.03.21 |
Run Loop vs DispatchQueue (0) | 2022.03.13 |
DiffableDataSource와 Realm (0) | 2022.03.03 |
Comments